2017-03-01 80 views
2

我已將angular file saver實施到我的項目中,目的是下載文件,它適用於小文件,但對於大於50mb的文件,我會看到下一個錯誤並在35-50mb之後停止下載。使用角度文件保護程序下載大尺寸文件

net::ERR_INCOMPLETE_CHUNKED_ENCODING 

我試圖在互聯網上調查這個問題,並發現有一個限制下載500MB,因爲顯然不能在RAM中存儲這麼多的信息。不幸的是,我沒有找到任何其他的解釋如何解決這個問題,然後我問了後端的人,我已經得到了答案,他的一切都很好。

那麼我的問題在哪裏?我該如何解決這個問題?我感謝所有幫助

這裏是我的代碼部分:

服務

function attachment(obj) { 
     custom.responseType = "arraybuffer"; 
     delete custom.params.limit; 
     delete custom.params.offset; 
     delete custom.params.orderBy; 
     delete custom.params.insertedAt; 

     var contentType = obj.mimeType; 
     var name = obj.displayFilename; 

     return $http.get(Config.rurl('attachments') + '/' + obj.bucketName + '/' + obj.path + '?displayFilename=' + obj.displayFilename, custom) 
      .then(function (response) { 
       var data = new Blob([response.data], { type: contentType }); 
       FileSaver.saveAs(data, name); 
       delete custom.responseType 
      }) 
      .catch(function (err) { 
       delete custom.responseType; 
       alert("It has happened an error. Downloading has been stopped") ; 
      }); 
    } 

控制器功能

$scope.download = function (obj) { 
     lovServices.attachment(obj) 
    } 

回答

4

而是下載到內存並將其轉換成團塊的。設置responseType'blob'

//SET responseType to 'blob' 
var config = { responseType: ̶'̶a̶r̶r̶a̶y̶b̶u̶f̶f̶e̶r̶'̶ ̶ 'blob' }; 

return $http.get(url, config) 
    .then(function (response) { 
     ̶v̶a̶r̶ ̶d̶a̶t̶a̶ ̶=̶ ̶n̶e̶w̶ ̶B̶l̶o̶b̶(̶[̶r̶e̶s̶p̶o̶n̶s̶e̶.̶d̶a̶t̶a̶]̶,̶ ̶{̶ ̶t̶y̶p̶e̶:̶ ̶c̶o̶n̶t̶e̶n̶t̶T̶y̶p̶e̶ ̶}̶)̶;̶ 
     //USE blob response 
     var data = response.data; 
     FileSaver.saveAs(data, name); 
    }) 
    .catch(function (err) { 
     alert("It has happened an error. Downloading has been stopped") ; 
     throw err; 
    }); 

這就避免了流轉換爲arraybuffer,然後再作出blob的內存開銷。

欲瞭解更多信息,請參閱MDN XHR API ResponseType

+0

是的,感謝解決方案和提供的鏈接。 – antonyboom

+0

由於這是一個AJAX請求,因此在調用saveAs()之前,必須將完整的文件內容加載到瀏覽器的內存中,對嗎?那麼這意味着非常大的文件刷新頁面將會丟失所有文件內容? – losmescaleros

+0

[Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob)是一個類似於流的異步異步對象。 [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)是一個內存對象。通過將[XHR responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType)設置爲Blob,可以避免將其加載到JavaScript內存的步驟。 JavaScript在加載之前將該流傳遞給FileSaver。 – georgeawg