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.

Était-ce utile?

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 ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top