node.js - 如何使用Node.js和express实现文件下载功能,提示用户保存文件?

标签 node.js express

基本上我想要一个按钮,人们可以点击它来导出一些数据。目前,我已将此连接到一个 ajax 调用,该调用调用服务器上的一些代码来获取数据。不幸的是,用户永远不会被提示保存文件或任何东西,调用只是成功完成。

如果我查看对 ajax 调用的响应,它包含我想要导出的 JSON。这是我到目前为止提出的代码:

#exportData is just a function that gets data based off of a surveyId
@exportData req.body.surveyId, (data) ->
    res.attachment('export.json')
    res.end(JSON.stringify(data),'UTF-8')

有什么建议可以提示用户保存文件而不是悄悄地返回数据吗?

最佳答案

我写了一个演示应用来玩一下:

app.js:

var express = require('express')
  , http = require('http')
  , path = require('path')
  , fs = require('fs')

var app = express();

var data = JSON.parse(fs.readFileSync('hello.json'), 'utf8')

app.get('/hello.json', function(req, res) {
  res.attachment('hello.json')
  //following line is not necessary, just experimenting
  res.setHeader('Content-Type', 'application/octet-stream')
  res.end(JSON.stringify(data, null, 2), 'utf8')
})

http.createServer(app).listen(3000, function(){
  console.log('Listening...')
});

hello.json:

{
  "food": "pizza",
  "cost": "$10"
}

只有 HTTP header ,我相信这只是特定于浏览器的。本质上,发生的事情是 res.attachment 函数将 Content-Disposition HTTP 服务器 header 设置为 attachment。某些浏览器(例如 Firefox)会提示您“另存为”。默认情况下,Chrome 和 Safari 不会。但是,您可以在 Chrome 或 Safari 的选项中更改此默认行为。我没有在 Internet Explorer 中测试。

我尝试更改 Content-Type 以查看是否会覆盖任何行为,但事实并非如此。

简而言之,您将无法覆盖用户的设置。

您可以在此处查看更多信息:How to force a Save As dialog when streaming a PDF attachment

关于node.js - 如何使用Node.js和express实现文件下载功能,提示用户保存文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882310/

相关文章:

node.js - res.send() 不发送当前响应,而是保留最后一个响应

javascript - {{#each}} 内的 Handlebars 表达式

node.js - 我如何托管Node JS和MongoDB

javascript - 管理异步并在 Node 中执行多个 MySQL 查询

node.js - Express router.post没有执行 block ,但发现

node.js - 为 REST api NodeJS MongoDB 编写测试

javascript - Node.js 和 64 位变体

node.js - 在 NextJS 的 API 上使用路径参数

node.js - 使用 socket.io 发送实时分析的最佳方法

node.js - Google Oauth 给出代码兑换错误