javascript 从(sinatra 的)流响应中保存文件

标签 javascript angularjs file save streaming

我正在使用 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/

相关文章:

javascript - 用逗号分割字符串,但使用 Javascript 忽略双引号内的逗号

javascript - 添加文件按钮如果超过一个则不起作用(jquery 文件上传插件)

javascript - 需要帮助使用 node.js 访问 mysql 数据库

javascript - Angular 动画类中 Greensock JavaScript 的非平滑补间

mysql - 使用 Express 发送字符串并查看数据库中是否存在值

python - 从文件号获取文件对象

javascript - 具有多个预览和多个实例的 Uploadcare

javascript - 动态添加 AngularJS 的属性和innerHTML

c - 在 C 中使用 FILE 和 char* 的读取器接口(interface)

android - 我怎样才能 "mount"Android 中的虚拟驱动器?