Question

I have been banging my head against the wall with this odd behaviour on Chrome

I have files stored encrypted on disk in an unnamed, unordered state. when the files are downloaded by the user, the client is redirected to a download handlers (.ashx) the data is loaded into a stream, decrypted and sent to the client. Now this has worked fine until recently,

It works fine on all browsers except chrome where the file is downloaded as a .gz file and is unreadable?

I have stripped out the stream fetching and cryptography parts for brevity (keep in mind this works perfectly on 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

Any help would be greatly appreciated.

Here is the HTTP header from fiddler when the file is downloaded in 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

Note that the filename is codekiwi.txt and the contents are some simple plain text, the file gets saved as codekiwi.txt.gz and contains gibberish.

Was it helpful?

Solution

Ok, solved it myself. I turns out that Chrome (and Firefox) REALLY don't like the response.ClearHeaders call, for some reason IE was ok with this, once I removed it the downloads functioned as expected again...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top