使用Azure.Storage.Files.Shares将PDF文件从Azure文件下载到字节时出现问题

问题描述

我以前使用Windows.AzureStorage从我的Azure存储帐户下载PDF文件,并将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,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,byteReturnValue.Length)
                    Response.OutputStream.Flush()
                    Response.OutputStream.Close()
                    Response.Flush()
                    Response.Close()

解决方法

找到了解决方案。这是有效的代码。也要简单得多。我的想法来自this question,谢谢Jon Skeet

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