从 Azure 存储流式传输 blob - 无法访问已关闭的流

Posted

技术标签:

【中文标题】从 Azure 存储流式传输 blob - 无法访问已关闭的流【英文标题】:Streaming a blob from Azure storage - Cannot access a closed Stream 【发布时间】:2019-02-06 23:13:13 【问题描述】:

我正在使用 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】:

无法访问已关闭的流

根据错误信息,提示需要重新设置码流位置。

请在返回之前尝试重置流位置。 blob.DownloadToStream(ms); ms.位置 = 0; //添加这段代码 返回毫秒;

更新:

ms 如果不在使用部分,则已关闭。所以请尝试使用以下代码。

MemoryStream stream = new MemoryStream();
using (MemoryStream ms = new MemoryStream())

  blob.DownloadToStream(ms);
  ms.Position = 0
  ms.CopyTo(stream);
  stream.Position = 0;
  return stream;

【讨论】:

嗨,汤姆,我添加了 ms.Position=0 但我遇到了同样的问题。这是我在检查 pdfScript.Position:'pdfScript.Position' 的值时收到的消息,它抛出了“System.ObjectDisposedException”类型的异常数据:System.Collections.ListDictionaryInternal HResult:-2146232798 HelpLink:null InnerException:null消息:“无法访问已关闭的流。” ObjectName: "" Source: "mscorlib" StackTrace: " at System.IO.__Error.StreamIsClosed()\r\n at System.IO.MemoryStream.get_Position()" TargetSite: Void StreamIsClosed() @Anne ms 如果不使用部分,则已关闭。我已经更新了答案。 嗨,Tom,它现在可以工作了,但是在将 ms 复制到流之前,您必须将位置设置为 ms 为 0:ms.Position=0 然后 ms.CopyTo(stream)。谢谢 是的。你是对的。抱歉错过了。我更新了答案。

以上是关于从 Azure 存储流式传输 blob - 无法访问已关闭的流的主要内容,如果未能解决你的问题,请参考以下文章

通过 Azure 媒体服务从 Azure 云存储 Blob 流式传输 mp3(仅限音频)

csharp 通过.net WebAPI将Azure存储专用容器blob下载/流式传输到AngularJS

未找到任何事件 - Azure 事件中心

从 SQLite db 流式传输音频

使用 Node 和 graphql 将文件流式上传到 Azure Blob 存储

azure blob storage-无法从传输连接读取数据:现有连接被远程主机强行关闭