سؤال

ولقد تم ضجيجا رأسي بالحائط مع هذا السلوك الغريب على كروم

ولدي الملفات المخزنة على القرص مشفرة في دولة غير مرتبة لم تسمها. عندما يتم تحميل الملفات من قبل المستخدم، يتم إعادة توجيه العميل ليتم تحميل البيانات إلى تيار، فك وإرسالها إلى العميل تحميل معالجات (.ashx). الآن وقد عملت هذه الغرامة حتى وقت قريب،

وأنه يعمل بشكل جيد على جميع المتصفحات باستثناء الكروم حيث يتم تحميل الملف كملف .gz وغير قابل للقراءة؟

ولقد جردت من تيار جلب والتشفير قطع الغيار اللازمة لالإيجاز (نضع في اعتبارنا هذا يعمل تماما على IE، فايرفوكس الخ)

    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

وأي مساعدة سيكون موضع تقدير كبير.

وهنا هو رأس HTTP من عازف الكمان عندما يتم تحميل الملف في الكروم

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

لاحظ أن اسم الملف وcodekiwi.txt ومحتويات بعض نص عادي بسيط، ويحصل على حفظ الملف كما codekiwi.txt.gz ويحتوي على رطانة.

هل كانت مفيدة؟

المحلول

وطيب، وحلها بنفسي. I تبين أن كروم (وفايرفوكس) حقا لا أحب response.ClearHeaders الدعوة، لسبب IE كان طيب مع هذا، مرة واحدة إزالته بمهامها التنزيلات كما هو متوقع مرة أخرى ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top