1

簡介背景:我有一個將文件存儲在Azure Blob存儲中的Web服務。該服務的用戶可以一次下載多個文件。如果下載的所有文件的總文件大小相對較小,那麼我將ZIP文件壓縮到我的服務器上並返回該ZIP文件 - 這裏沒有問題。從瀏覽器按順序從Azure Blob存儲下載文件

場景:例如,如果用戶想下載3個每個文件大小爲1GB的文件,將這些文件下載到服務器並不現實,請將其壓縮並將ZIP文件返回給瀏覽器。因此,對於這些場景,我會將Azure Blob存儲URL返回給瀏覽器,並讓用戶直接從Azure Blob存儲下載文件,以免對我的服務器造成壓力。

問題:目前,瀏覽器只收到所有這些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 

} 
+0

顯示代碼如何一次下載這些文件,所以我們可以從這一點開始。 –

+0

關於如何下載這些文件沒有任何代碼。這實際上是對Azure Blob存儲URL的GET請求。 –

+0

你是如何做出GET請求的,顯示代碼:是通過jQuery,本地還是其他。 –

回答

1

你可以嘗試jquery.fileDownloadPromise

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)) 
} 

你也應該修改這個庫,因爲它需要作爲迴應,您無法提供由於直接鏈接到斑點(if的陳述條件被替換):

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; 
} 
+0

這看起來不錯,我會給它一個。我是一個C#人,我的JS/JQuery一般最好,所以謝謝你! –

相關問題