问题描述
我以前使用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