2014-09-12 108 views
0

我有一個後臺服務器在播放框架,它以塊的形式返回巨大的文本/ csv文件。 如何以角度接收文件以便能夠將文件保存在客戶端中。從Angular服務器下載文本/ csv內容爲大文件

在我可以採用如下方案常規文件下載:

$http.post('/exportFile', reqData). 
      success(function(data, status, headers, config){ 
       var pom = document.createElement('a'); 
       pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data)); 
       pom.setAttribute('download', "file.csv"); 
       pom.click(); 
      }). 
      error(function(data, status, headers, config){ 
       alert(data); 
      }); 

但如何處理塊? 謝謝!

回答

2

的幾點思考 -

默認的角度和潛在的HTTP協議棧將抽象的「塊」從你進入一個成功/失敗的回調。如果你真的想要塊數據,你可能需要一個不同的URL方案來分頁結果(然後發出一系列請求),或者像websockets這樣的web推送方法(服務器推送每一點)。也許我錯過了一些東西,但是在/ exportFile請求完成後,您是否嘗試在角度內發出另一個請求?

$http.post('/exportFile', reqData).success(function(...){ 
    // create url to where file.csv is, say fileURL 
    var fileUrl = encodeURIComponent(data); 
    $http.get(fileUrl).success(function(data...) { 
    // data is now the contents of file.csv. 
    fileContents = data; 
    }); 
} 

CSV文件可能很容易壓縮,也許你已經這樣做了。

最後,推薦使用angular的MVC模式是在指令中構建元素並利用雙向綁定。您也可以單擊該元素上的鏈接,如果你想立即觸發指令中下載它通過後會出現:

$timeout(function() { 
    angular.element(directiveElement).triggerHandler('click'); 
}, 0); 

好,希望幫助

+0

所以基本上你說,如果服務器返回的文件在大塊,它可以在前端使用普通的$ http.success處理程序接收? 有沒有必要處理塊? – 2014-09-13 17:14:54

+0

另一個雖然,當寫塊,爲什麼我看不到每個寫入方法幾個響應? 公共靜態結果指數(){// 準備一個分塊文本流 結塊塊=新StringChunks(){ //調用時,流準備 公共無效onReady(Chunks.Out 出){ out.write( 「琪琪」); out.write(「foo」); out.write(「bar」); out.close(); } }; //用200 OK提供此流 return ok(chunks); } – 2014-09-14 10:49:01

+0

我不認爲你會在每個.write()調用中以1對1的方式獲得對客戶端文件的增量訪問。由於comet/websockets/sse更多地取代了流媒體,所以分塊的響應根本得不到支持。無論如何,你也可以直接使用XHR來嘗試單獨獲取每個塊,例如var xhr = new XMLHttpRequest() xhr.open(「POST」,「/ exportFile」,true) xhr.onprogress = function(){ console.log(「onProgress」+ xhr.responseText) } – 2014-09-15 18:49:20