从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);
好,希望帮助
所以基本上你说,如果服务器返回的文件在大块,它可以在前端使用普通的$ http.success处理程序接收? 有没有必要处理块? – 2014-09-13 17:14:54
另一个虽然,当写块,为什么我看不到每个写入方法几个响应? 公共静态结果指数(){// 准备一个分块文本流 结块块=新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
我不认为你会在每个.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