Не удается открыть файл .pdf в IE8 - PullRequest
0 голосов
/ 28 февраля 2011


Я разместил этот вопрос на веб-форуме asp.net, но никто не ответил.

Я не могу открыть "ОДНУ" страницу файла .pdf с помощью IE8 и выдает сообщение об ошибке " файл поврежден и не может быть восстановлен " при извлечении из SQL Server 2008, но более одной страницы я могу открыть без проблем.

С помощью Chrome я могу открыть любое количество страниц .pdf.

Та же страница, которую я не могу открыть с помощью IE8 из БД, можно открыть непосредственно с жесткого диска с помощью IE8.

Мой код в файле .asxh:

    context.Response.ContentType = "application/pdf" 
    Dim strm As Stream = ShowNewsImage(imgName) 
    If Not strm Is Nothing Then 
        Dim buffer As Byte() = New Byte(4095) {} 
        Dim byteSeq As Integer = strm.Read(Buffer, 0, 4096) 

        Do While byteSeq > 0 
            context.Response.OutputStream.Write(buffer, 0, byteSeq) 
            byteSeq = strm.Read(Buffer, 0, 4096) 
        Loop 
        context.Response.BinaryWrite(buffer) 
    End If 

Спасибо,

Ахмед.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2011

Кажется слишком очевидным, но я должен спросить ... ты пробовал это?

Response.WriteFile(imgName)

Ссылка на документацию на случай, если вы не знакомы с этим. :)

0 голосов
/ 04 марта 2011

Проблема решена.

Я изменил буфер с Object на Byte, и это сработало !!!

Старый код (часть обработчика):

context.Response.ContentType = "application/pdf"
    Dim strm As Stream = ShowNewsImage(imgName)
    If Not strm Is Nothing Then
        Dim buffer As Byte() = New Byte(4095) {}
        Dim byteSeq As Integer = strm.Read(buffer, 0, 4096)

        Do While byteSeq > 0
            context.Response.OutputStream.Write(buffer, 0, byteSeq)
            byteSeq = strm.Read(buffer, 0, 4096)
        Loop
        context.Response.BinaryWrite(buffer)
        context.Response.End()
    End If
End Sub

Public Function ShowNewsImage(ByVal imgName As String) As Stream
    Dim conn As String = ConfigurationManager.ConnectionStrings("Connection").ConnectionString
    Dim connection As SqlConnection = New SqlConnection(conn)
    Dim sql As String = "SELECT image FROM Table WHERE ID = @ID"
    Dim cmd As SqlCommand = New SqlCommand(sql, connection)
    cmd.CommandType = CommandType.Text
    cmd.Parameters.AddWithValue("@ID", imgName)
    connection.Open()
    Dim img As <strong>Object </strong>= cmd.ExecuteScalar()
    Try
        Return New MemoryStream(CType(img, Byte()))
    Catch
        Return Nothing
    Finally
        connection.Close()
    End Try
End Function

Как видите, ExecuteScalar () прикрепил вывод к объекту.Я изменил это на Байт:

context.Response.ContentType = "application/pdf"
    Dim buffer As Byte() = New Byte(4095) {}
    Dim byteSeq As Integer = 0
    Dim conn As String = ConfigurationManager.ConnectionStrings("Connection").ConnectionString
    Dim connection As SqlConnection = New SqlConnection(conn)
    Dim sql As String = "SELECT image FROM Table WHERE ID = @ID"
    Dim cmd As SqlCommand = New SqlCommand(sql, connection)
    cmd.CommandType = CommandType.Text
    cmd.Parameters.AddWithValue("@ID", imgName)
    connection.Open()

    buffer = cmd.ExecuteScalar()

    context.Response.BinaryWrite(buffer)
    context.Response.End()

Нет необходимости в context.Response.OutputStream.Write, он уже заблокирован в context.Response.BinaryWrite

У меня ушло два дня.

0 голосов
/ 28 февраля 2011

Установите для Response.buffer значение true и response.flush после завершения PDF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...