通过SAS下载天蓝色blob

时间:2020-04-14 22:07:03

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

全部

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

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

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

这有效,我可以将以该前缀开头的文件集下载到客户端计算机。但是,这取决于Web服务器的速度及其相对较慢。

是否有一个示例,说明如何通过为文件夹提供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??

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

首先,您不能为虚拟文件夹拥有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 Storage 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!");
    }
}