从浏览器顺序下载Azure Blob存储中的文件

时间:2017-12-18 12:09:43

标签: c# azure azure-storage azure-storage-blobs azure-blob-storage

简要背景:我有一个Web服务,可以在Azure Blob存储中存储文件。该服务的用户可以一次下载多个文件。如果正在下载的所有文件的总文件大小相对较小,那么我将服务器上的文件压缩并返回该ZIP文件 - 这里没问题。

场景:例如,如果用户想要下载3个1GB的文件,那么将这些文件下载到服务器并将其压缩,然后将ZIP文件返回给浏览器并不现实。 。因此,对于这些场景,我将Azure Blob存储URL返回到浏览器,并让用户直接从Azure Blob存储下载文件,以免给我的服务器带来压力。

问题:目前,浏览器只接收所有这些URL并一次性下载所有这些URL。我需要一种顺序下载这些文件的方法。因此,浏览器会收到一个Blob存储URL列表,并一次下载一个。但是,我不知道如何在一次下载完成后在浏览器上进行检测,因此可以开始另一次下载。

欢迎任何有关如何处理这方面的意见/建议。

编辑:我的前端收到下载ID列表并开始下载

for(var i = 0; i < listOfDownloads.length; i++) {

    //Go direct to Azure blob storage for each ID in list of IDs
    //This immediately begins a download direct from blob storage
    window.location.href = {azure blob storage URL};

    //Find way of detecting when download complete so can move on to next

}

1 个答案:

答案 0 :(得分:1)

您可以使用Promise

尝试jquery.fileDownload
function downloadFilesSequantially(listOfDownloads) {

    function downloadComplete(link) {
      return new Promise(function(res, rej) {
        $.fileDownload(link)
          .done(function() {
            res(0);
          })
          .fail(function() {
            rej(0);
          });
      })     
    }

    listOfDownloads.reduce(function(prev, next) {
      return prev.then(downloadComplete(next));
    }, Promise.resolve(0))
}

此外,您应该修改此库,因为它需要特定的cookie作为响应,由于直接链接到blob而无法提供(if的语句条件已被替换):< / p>

if (true/*document.cookie.indexOf(settings.cookieName + "=" + settings.cookieValue) != -1*/) {

    //execute specified callback
    internalCallbacks.onSuccess(fileUrl);

    //remove the cookie and iframe
    document.cookie = settings.cookieName + "=; expires=" + new Date(1000).toUTCString() + "; path=" + settings.cookiePath;

    cleanUp(false);

    return;
}