从Azure存储流式传输Blob-无法访问封闭的流

时间:2018-08-31 23:22:18

标签: asp.net webforms azure-storage filestream memorystream

我正在使用asp.net网络表单。

我在Azure存储中有需要处理的pdf。我正在使用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));

谢谢您的帮助。

1 个答案:

答案 0 :(得分:3)

  

无法访问封闭的流

根据错误信息,表明您需要重置流位置。

在返回流之前,请尝试重置流的位置。 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;
}