全部
我有一个带有嵌套文件名的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??
我可以使用这样的东西吗?
谢谢!
答案 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!");
}
}