Проблема со скачиванием PDF-файла из файла Azure в байты с помощью Azure.Storage.Files.Shares

Ранее я использовал Windows.AzureStorage для загрузки PDF-файлов из моей учетной записи хранения Azure и потоковой передачи PDF-файлов в браузер. Поскольку он устарел, я пытаюсь соответствовать Azure.Files.Storage.Shares.

Обратите внимание, что я мог использовать Windows.AzureStorage в течение многих лет.

Я могу получить файл из Azure и прочитать байты, но когда я пытаюсь передать их в браузер, файл не является допустимым PDF.

Старый способ сделать это выглядел так:

                    pdfFile.FetchAttributes()

                    Dim byteData As Byte() = New Byte(pdfFile.Properties.Length - 1) {}

                    pdfFile.DownloadToByteArray(byteData, 0)

                    byteReturnValue = byteData

Это жестко закодированная тестовая функция, которая работает, но не отображает действительный PDF. Количество байтов, возвращенных с помощью нового метода, показанного ниже, равно 98 284. Количество байтов, возвращенных предыдущим (успешным) методом, равно 98 284. Это как-то связано со смещением??

Я в своем уме.

    Public Shared Function GetPDFStream() As Byte()

    Dim connectionString As String = ConfigurationManager.AppSettings("StorageConnectionString")
    Dim shareName As String = "root"
    Dim dirName As String = "invoicestest\MSEVN"
    Dim fileName As String = "EVE0042361.pdf"
    Dim share As ShareClient = New ShareClient(connectionString, shareName)
    Dim directory As ShareDirectoryClient
    Dim cloudfile As ShareFileClient
    Dim download As ShareFileDownloadInfo

    directory = share.GetDirectoryClient(dirName)

    cloudfile = directory.GetFileClient(fileName)

    download = cloudfile.Download()

    Dim byteData As Byte() = New Byte(download.ContentLength - 1) {}

    download.Content.Read(byteData, 0, download.ContentLength - 1)

    GetPDFStream = byteData

End Function

Эти байты возвращаются на другую страницу, которая выводит байты в браузер (эта часть в порядке, но я показываю, как используются байты)

                    Response.Buffer = True

                    Dim strMimeType = "application/pdf"

                    Response.Clear()
                    Response.ContentType = strMimeType

                    Response.AddHeader("content-disposition", "attachment;filename=" & strFileName)

                    Response.OutputStream.Write(byteReturnValue, 0, byteReturnValue.Length)
                    Response.OutputStream.Flush()
                    Response.OutputStream.Close()
                    Response.Flush()
                    Response.Close()


person Joe Schmucker    schedule 25.09.2020    source источник
comment
При просмотре текста рабочего PDF и недопустимого PDF кажется, что плохой имеет только начальную часть файла. Даже если количество байтов одинаковое, похоже, что вызов загрузки не возвращает весь файл. Я не уверен, как вернуть весь файл.   -  person Joe Schmucker    schedule 25.09.2020


Ответы (1)


Нашел решение. Это код, который работает. Тоже гораздо проще. Я получил идею из этот вопрос Спасибо, Джон Скит!!

Public Shared Function GetPDFStream() As Byte()

    Dim connectionString As String = 
    ConfigurationManager.AppSettings("StorageConnectionString")
    Dim shareName As String = "root"
    Dim dirName As String = "invoicestest\MSEVN"
    Dim fileName As String = "EVE0042361.pdf"
    Dim share As ShareClient = New ShareClient(connectionString, shareName)
    Dim directory As ShareDirectoryClient
    Dim cloudfile As ShareFileClient
    Dim download As ShareFileDownloadInfo

    directory = share.GetDirectoryClient(dirName)

    cloudfile = directory.GetFileClient(fileName)

    download = cloudfile.Download()

    Dim stream As New MemoryStream

    download.Content.CopyTo(stream)

    GetPDFStream = stream.ToArray()

End Function
person Joe Schmucker    schedule 25.09.2020