2016-01-15 39 views
2

我注意到在詢問如何 「Detect when browser receives file download」之前有一個問題。僅從客戶端檢測下載開始/文件傳輸的開始

這需要服務器發送cookie以完成步驟。 但是,我想檢測瀏覽器是否僅在客戶端接收文件,因爲我無法修改服務器端的任何內容。

我遇到的問題是我必須從網站下載許多zip文件。 zip文件是動態生成的,因此在我提交請求之前沒有可下載的URL。首先,我寫一個for循環來做到這一點,如下所示。

function myfunc(i){ 
    setTimeout(function(){ 
    $("form").submit(); 
    },2000*(i) 
} 
for (i=1; i<4; i++) { 
myfunc(i); 
} //i 

但是有一個機會,瀏覽器接收的第一個文件(i=1)之前,瀏覽器將已經提交申請第二個文件(i=2)形式並取消第一個文件的請求。所以我必須在請求第二個文件之前確保第一個文件已經啓動。

ajax似乎不是一個選項,因爲它似乎是無法處理壓縮文件下載。

我該怎麼做?

+0

可能重複[如何異步上傳文件?](http://stackoverflow.com/questions/166221/how-can-i-upload-files-asynchronously) – Populus

+0

也許你可以下載文件到用戶的localStorage ,你可以控制它。我以前沒有這樣做過,但[this](http://stackoverflow.com/questions/4940586/can-you-use-html5-local-storage-to-store-a-file-if-not-how )可能會給你一些方向。 –

+0

@Populus - 表明重複是上傳,而不是下載。這不會解決這個問題。 – Mogsdad

回答

0

編輯: 您也可以通過ajax調用來獲取zip的base64字符串,然後客戶端將其轉換爲html5中的blob。但是這需要base64對文件服務器端進行編碼,並且將文件大小增加了大約33%。


我會做一個Ajax調用,檢查在文件開始下載一個帶有計時器後,已經產生:當文件被發現,我會等待幾秒鐘,

$.ajax({ 
    type: 'HEAD', 
    url: 'generatedfileurl', 
    success: function() { 
     alert('File found.'); 
    }, 
    error: function() { 
     alert('File not found.'); 
    } 
}); 

然後然後開始下載nr2,因爲我認爲文件nr1已經在下載,因爲它已經生成了。

這是遠非理想,我一定會推薦使用cookie或其他服務器端。