【问题标题】:azure blob download via SAS通过 SAS 下载天蓝色 blob
【发布时间】:2020-04-15 13:04:07
【问题描述】:

全部,

我有一个带有嵌套文件名的 blob 容器(模拟文件夹)。

是否可以通过代码(绕过网络服务器)通过 SAS URI 下载一堆以前缀开头的文件? 现在,我正在压缩这些文件并将其发送到下面的流中..

  CloudBlobContainer container = GetRootContainer();
  CloudBlockBlob caseBlob = container.GetBlockBlobReference(folderPrefix);
  await caseBlob.DownloadToStreamAsync(zipStream);

这行得通,我可以以该前缀开头的文件集下载到客户端计算机。然而,这取决于网络服务器的速度和相对较慢的速度。

有没有关于如何通过为文件夹提供 URI 来使用 SAS 下载的示例?这是我从 stackoverflow 的另一篇文章中找到的示例

var sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5);
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10);
sasConstraints.Permissions = SharedAccessBlobPermissions.Read;

var sasBlobToken = blob.GetSharedAccessSignature(sasConstraints);

return blob.Uri + sasBlobToken;
//Here can the URI point to the prefix??

我可以使用这样的东西吗?

谢谢!

【问题讨论】:

  • 我不确定我是否清楚您要做什么。从 blob 存储下载文件,但“绕过服务器”是什么意思?服务器端代码使用 blob 存储 sdk 生成过期的 SAS 链接。您是否需要不会过期并且可以在其他地方静态放置和访问的 SAS 链接?
  • 我的网络应用程序在天蓝色服务器上运行,当我下载它时,它会通过服务器下载到本地电脑,因此速度很慢..
  • 服务器不就是生成下载链接,然后客户端出去直接从blob存储中获取文件吗?
  • 是的,但是如果您必须为客户将多个文件下载到一个文件夹中,您会怎么做?
  • 非常类似于用户尝试做的事情here

标签: c# azure asp.net-core azure-blob-storage


【解决方案1】:

这当然是可行的,但它不会是一个单一的步骤。

首先,您不能拥有虚拟文件夹的 SAS 令牌。您需要获得具有 List(用于列出 Blob)和 Read(用于下载 Blob)权限的 Blob 容器的 SAS 令牌。

接下来,您将列出 Blob 容器内的虚拟文件夹中的 Blob。为此,您需要将虚拟文件夹路径指定为前缀。这将为您提供该虚拟文件夹内的 blob 列表。请确保将空字符串指定为分隔符,以便列出该虚拟文件夹中的所有 Blob。

获得 blob 列表后,您需要读取(下载)blob 并将 blob 内容存储在浏览器中的某个位置。

阅读完 blob 内容后,您可以使用基于 JS 的 zip 库来动态创建 zip 文件内容,一旦将所有 blob 添加到 zip 文件中,您就可以强制下载该 zip 文件。快速搜索基于 JS 的 zip 库让我来到这里:https://stuk.github.io/jszip/。当我在自己构建的产品中实现此功能时,我使用了 ZipJS 库,但遗憾的是我现在无法在网上找到它。

我多年前编写的代码的点点滴滴(它是一个更大的应用程序的一部分 + 我编写它时没有 JS 存储 SDK,如果代码对您没有多大意义,敬请见谅。请将其用于仅供一般指导)。

    zip.workerScriptsPath = '/Scripts/ZipJS/';
    zipWriter = new zip.BlobWriter();
    zip.createWriter(zipWriter, function (zipWriter) {
        startZippingFiles(zipWriter);
    }, function () {

    }, true);


function startZippingFiles(writer) {
    if (downloadedContent.length > 0) {//downloadedContent is an array containing downloaded blobs
        var downloadedContentItem = downloadedContent.shift();//read first item
        var cloudBlob = downloadedContentItem.Blob;//get the cloud blob object
        var blobContents = downloadedContentItem.Content;//get the blob's content
        var status = downloadedContentItem.Status;//status to track blob's download status
        if (status === 'Completed') {
            writer.add(cloudBlob.name,
                new zip.BlobReader(new Blob([blobContents], { type: cloudBlob.properties.contentType })), function () {
                    console.log(cloudBlob.name + ' added to zip...')
                    downloadedBlobsCount += 1;
                    startZippingFiles(writer);
                }, function (o) {
                    console.log('Adding ' + cloudBlob.name + ' to zip file. ' + parseFloat((o * 100) / cloudBlob.size).toFixed(2) + '% done...');
                });
        }
    } else {
        writer.close(function (blob) {//Finally save the zipped data as download.zip
            saveAs(blob, "download.zip");
            zipWriter = null;
        });
        console.log("Download successful!");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-30
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多