Chrome guarda el archivo transmitido como .gz
-
22-07-2019 - |
Pregunta
He estado golpeando mi cabeza contra la pared con este extraño comportamiento en Chrome
Tengo archivos almacenados encriptados en el disco en un estado sin nombre ni orden. cuando el usuario descarga los archivos, el cliente se redirige a un controlador de descarga (.ashx), los datos se cargan en una secuencia, se descifran y se envían al cliente. Ahora esto ha funcionado bien hasta hace poco,
¿Funciona bien en todos los navegadores, excepto Chrome, donde el archivo se descarga como un archivo .gz y no se puede leer?
He eliminado las partes de búsqueda de flujo y criptografía por brevedad (tenga en cuenta que esto funciona perfectamente en 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
Cualquier ayuda sería muy apreciada.
Aquí está el encabezado HTTP del fiddler cuando el archivo se descarga 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
Tenga en cuenta que el nombre de archivo es codekiwi.txt y el contenido es texto simple, el archivo se guarda como codekiwi.txt.gz y contiene galimatías.
Solución
Ok, lo resolví yo mismo. Resulta que Chrome (y Firefox) REALMENTE no me gusta la respuesta. Llamada de ClearHeaders, por alguna razón IE estuvo bien con esto, una vez que lo eliminé, las descargas funcionaron como se esperaba nuevamente ...