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

时间:2013-02-14 19:14:29

标签: 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')

有任何建议让这个提示用户保存文件而不是只是静静地返回数据吗?

1 个答案:

答案 0 :(得分:4)

我写了一个演示应用程序来玩这个:

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

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

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

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