Потоковая передача PDF-файлов из файловой системы в браузер за ASP.net - PullRequest
0 голосов
/ 09 июля 2020

Невозможно прочитать файл PDF из файловой системы и отобразить его в браузере. Ниже приведен образец page_load:

        Dim filepath As String = "pdf" <-- this is the actual path to the PDF file on the file system.
        Dim fs As System.IO.FileStream
        Dim buffer(1024) As Byte
        Dim bytecount As Long
        fs = System.IO.File.OpenRead(filepath)

        Response.ContentType = "application/pdf"

        While bytecount = fs.Read(buffer, 0, buffer.Length) > 0
            Response.OutputStream.Write(buffer, 0, buffer.Length)

        End While

При загрузке страницы пытается открыть PDF-файл, но сообщает, что PDF-файл не читается. Разрешения не проблема, папка и файл имеют доступ на чтение для всех. Есть идеи?

1 Ответ

0 голосов
/ 09 июля 2020

Это может быть или не быть root вашей проблемы, но строка внутри l oop неверна. Когда вы читаете последний блок из файла, он может не заполнить весь буфер, но вы все равно пишете весь буфер. Это:

Response.OutputStream.Write(buffer, 0, buffer.Length)

должно быть таким:

Response.OutputStream.Write(buffer, 0, bytecount)

На самом деле, если присмотреться, я вижу, что ваше условие завершения l oop тоже неверно. Вы написали это так же, как в C#, где задания производят результат. В VB это не так, поэтому вам нужно немного иначе структурировать код. Учитывая это изменение, упомянутое выше, и некоторые другие исправления, ваш код должен выглядеть примерно так:

Response.ContentType = "application/pdf"

Const BUFFER_LENGTH As Integer = 1024

Dim filePath = "file path here"
Dim buffer(BUFFER_LENGTH - 1) As Byte

Using fs = File.OpenRead(filePath)
    Dim byteCount = fs.Read(buffer, 0, BUFFER_LENGTH)

    While byteCount > 0
        Response.OutputStream.Write(buffer, 0, byteCount)
        byteCount = fs.Read(buffer, 0, BUFFER_LENGTH)
    End While
End Using

Это не проверено, поэтому я не уверен, есть ли другие проблемы, но это решает многое о том, что не так с вашим существующим кодом.

...