从Angular服务器下载文本/ csv内容为大文件

问题描述:

我有一个后台服务器在播放框架,它以块的形式返回巨大的文本/ 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); 
      }); 

但如何处理块? 谢谢!

的几点思考 -

默认的角度和潜在的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