我正在使用 streaming response在服务器端 - 运行 sinatra。
我如何以某种方式处理客户端文件下载(javascript + angular),我的流媒体响应不会先完全加载,然后才提供保存到文件?
我目前的建议。看起来类似于这个(使用 FileSaver ):
$http.post('/foo', bar)
.success(function (data) {
var blob = new Blob([data], {type: "text/plain;charset=utf-8"});
saveAs(blob, 'A.csv');
}).
我仍然觉得响应首先被完全下载,然后才提供保存。
问题是,下载的文件可能很大,所以只是想为最终用户提供快速响应。
最佳答案
嗯,following answer似乎说出了我在这里错过的一切。
在客户端,我最终得到了解决方案,它以普通的旧 html 方式提交
<form method='POST' action="/foo">
...
<button type="submit" ...>Submit</button>
</form>
在服务器端,我使用了正确的内容类型:
post '/foo' do
...
content_type 'application/download'
事情似乎比我最初预期的要简单得多。
更新:
更合适way found (因为我可以指定文件名以及使用正确的内容类型):
post '/foo' do
...
content_type 'text/plain'
headers["Content-Disposition"] = "attachment; filename=foo.txt"
关于javascript 从(sinatra 的)流响应中保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27122840/