我正在使用asp.net webforms。
我在Azure存储中有pdfs,我需要处理。我正在使用PDFJet库来做到这一点。
我想在不下载的情况下传输pdf,因为我必须处理大量的pdf。
我使用以下函数从Azure流式传输pdf:
public MemoryStream DownloadToMemoryStream(DTO.BlobUpload b)
{
CloudStorageAccount storageAccount = Conn.SNString(b.OrgID);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(b.Container);
CloudBlockBlob blob = container.GetBlockBlobReference(b.FileName);
var sasToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
Permissions = SharedAccessBlobPermissions.Read,
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10),//assuming the blob can be downloaded in 10 miinutes
}, new SharedAccessBlobHeaders()
{
ContentDisposition = "attachment; filename=file-name"
});
using (MemoryStream ms = new MemoryStream())
{
blob.DownloadToStream(ms);
return ms;
}
}
在aspx.cs页面中,以下代码用于阅读pdf流:
BufferedStream pdfScript = new BufferedStream(new FileStream(ScriptPath + Script, FileMode.Open));
SortedDictionary<Int32, PDFobj> objects = pdfFinalScript.Read(pdfScript);
但是我收到错误消息:无法访问已关闭的流
如果我将pdf下载到磁盘,这是我使用的功能,这项工作但不实用:
blockBlob.DownloadToFile(b.LocalPath + b.FileName, FileMode.Create);
BufferedStream pdfScript = new BufferedStream(new FileStream(ScriptPath + Script, FileMode.Open));
谢谢您的帮助。
无法访问封闭的Stream
根据错误信息,它表示您需要重置流位置。
请在返回之前尝试重置流位置。 blob.DownloadToStream(MS); ms.Position = 0; //添加此代码返回ms;
更新:
如果没有使用部分,ms
被关闭。所以请尝试使用以下代码。
MemoryStream stream = new MemoryStream();
using (MemoryStream ms = new MemoryStream())
{
blob.DownloadToStream(ms);
ms.Position = 0
ms.CopyTo(stream);
stream.Position = 0;
return stream;
}