Enregistrement du fichier en streaming par Chrome sous le format .gz
-
22-07-2019 - |
Question
Je me suis cogné la tête contre le mur avec ce comportement étrange sur Chrome
J'ai des fichiers stockés cryptés sur le disque dans un état non nommé et non ordonné. lorsque les fichiers sont téléchargés par l'utilisateur, le client est redirigé vers un gestionnaire de téléchargement (.ashx), les données sont chargées dans un flux, déchiffrées et envoyées au client. Maintenant, cela a bien fonctionné jusqu'à récemment,
Cela fonctionne très bien sur tous les navigateurs sauf chrome où le fichier est téléchargé en tant que fichier .gz et est illisible?
J'ai supprimé les parties de récupération de flux et de cryptographie par souci de concision (gardez à l'esprit que cela fonctionne parfaitement sur IE, Firefox, etc.)
Private Function StreamFile(ByVal context As System.Web.HttpContext) As Boolean
context.Response.Clear()
context.Response.ClearHeaders()
context.Response.BufferOutput = False
context.Response.ContentType = "application/octet-stream"
context.Response.AddHeader("content-disposition", "attachment;filename=""" & _sFileName & """")
context.Response.AddHeader("content-length", _iSize)
context.Response.Cache.SetNoServerCaching()
context.Response.Cache.SetMaxAge(System.TimeSpan.Zero)
Dim oInputStream As System.IO.Stream = GetStream()
Dim oBufferedStream As New BufferedStream(oFileStream, context.Response.OutputStream)
oBufferedStream.ProcessStreams(True)
context.ApplicationInstance.CompleteRequest()
Return True
End Function
Public Class BufferedStream
Private _oInputStream As Stream
Private _oOutputStream As Stream
Private _bBuffer() As Byte
Public Const DEFAULT_BUFFER_SIZE As Integer = 8192
Public Sub New(ByRef oInputStream As Stream, ByRef oOutputStream As Stream)
_oInputStream = oInputStream
_oOutputStream = oOutputStream
_bBuffer = GetStreamBuffer(ToInteger(_oInputStream.Length))
End Sub
Public Function ProcessStreams(ByVal bCloseStreams As Boolean) As Boolean
Dim iRead As Integer = 0
Dim iStreamLength As Integer = ToInteger(_oInputStream.Length)
Try
iRead = _oInputStream.Read(_bBuffer, 0, _bBuffer.Length)
While iRead > 0
_oOutputStream.Write(_bBuffer, 0, _bBuffer.Length)
iRead = _oInputStream.Read(_bBuffer, 0, _bBuffer.Length)
If iRead < _bBuffer.Length Then System.Array.Resize(_bBuffer, iRead)
End While
If bCloseStreams Then
Close()
End If
Return True
Catch
Return False
End Try
End Function
Public Shared Function GetStreamBuffer(ByVal iStreamSize As Integer) As Byte()
Dim iBufferSize As Integer = iStreamSize - 1
If iBufferSize > DEFAULT_BUFFER_SIZE Then iBufferSize = DEFAULT_BUFFER_SIZE
Dim bBuffer As Byte() = New Byte(iBufferSize) {}
Return bBuffer
End Function
End Class
Toute aide serait grandement appréciée.
Voici l'en-tête HTTP de fiddler lorsque le fichier est téléchargé en chrome
HTTP/1.1 200 OK
Date: Fri, 30 Oct 2009 00:01:45 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
content-disposition: attachment;filename="codeKiwi.txt"
Content-Length: 349
Cache-Control: private, max-age=0
Content-Type: application/octet-stream
Notez que le nom du fichier est codekiwi.txt et que son contenu est un texte simple et clair. Le fichier est enregistré en tant que codekiwi.txt.gz et contient du charabia.
La solution
Ok, résolu moi-même. Il s'avère que Chrome (et Firefox) n'aime VRAIMENT pas la réponse. Appel de ClearHeaders, pour une raison quelconque, IE était d'accord avec cela, une fois que je l'ai supprimé, les téléchargements ont fonctionné comme prévu à nouveau ...