【问题标题】:Filestream a blob from Azure storage从 Azure 存储中流式传输 blob
【发布时间】:2019-01-27 10:03:43
【问题描述】:

我在 Azure 中有图像,需要使用 pdfJet 添加到 pdf 中。

这是我在读取磁盘上的图像时使用的代码,但是我有很多图像,从 Azure 下载它们没有意义。

Image image = new Image(objects, new BufferedStream(new FileStream(LocalPath + "image.PNG", FileMode.Open, FileAccess.Read)), ImageType.PNG);

PS:这是在 asp.net webforms 中完成的。

感谢您的帮助。

我现在正在使用以下函数来阅读 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 页面中:

MemoryStream pdfScript = B.DownloadToMemoryStream(b);

读取流:

SortedDictionary<Int32, PDFobj> objects = pdfFinalScript.Read(pdfScript);

但是我收到错误消息: 无法访问已关闭的 Stream

我已经查看了如何打开流,但没有成功。

请帮忙,谢谢

【问题讨论】:

    标签: c# asp.net webforms azure-storage filestream


    【解决方案1】:

    根据您的描述,您将从 Azure 下载 blob。 您可以参考以下几种方法。

    1.Download with blob url.

    创建具有读取权限和 Content-Disposition 标头集的共享访问签名,并基于此创建 blob URL 并使用该 URL。在这种情况下,blob 内容将直接从存储流式传输到客户端浏览器。

    2.获取 blob 和 DownloadFileFromBlob

    3.下载文件到exactly path in local

    网络表单

    您可以使用Response.Redirect(blobUrl); 重定向blob url 并下载它。

    在 .aspx 中:

    <asp:Button ID="Button1" runat="server" Text="Click Me" OnClick="Button1_Click" /> 
    

    在 aspx.cs 中:

    protected void Button1_Click(object sender, EventArgs e)
            {
                CloudStorageAccount account = new CloudStorageAccount(new StorageCredentials("accountname", "accountkey"), true);
                var blobClient = account.CreateCloudBlobClient();
                var container = blobClient.GetContainerReference("container");
                var blob = container.GetBlockBlobReference("text.PNG");
                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);
                    Image image = new Image(objects, ms, ImageType.PNG);
                }
            }
    

    【讨论】:

    • 嗨,看起来选项 1 将是一个选择,但是,我使用的是 asp.net webforms,我不确定如何使用 webforms 返回 url。任何想法?谢谢
    • @Anne,我已经更新了我的回复,你可以参考一下。如果您有任何问题,请随时告诉我。
    • 嗨乔伊,我仍然对如何使用这个 response.redirect 有点困惑,因为最后我需要以这种方式对 blob 进行文件流处理: Image image = new Image(objects, new BufferedStream (new FileStream(blobUrl, FileMode.Open, FileAccess.Read)), ImageType.PNG);
    • @Anne,您可以将 blob 下载到 Stream,然后您不需要将 blob 转换为流。
    • 嗨乔伊,对不起,我花了一段时间才回复,我想我快到了,我不得不修改你的函数,因为我想用它在 Azure 中打开 PDF,我已经修改了我的问题以反映我在寻找什么。你能看看吗。谢谢
    猜你喜欢
    • 2013-11-08
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多