基本上我想要一个人们可以点击导出一些数据的按钮。目前我已将其连接到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')
有任何建议让这个提示用户保存文件而不是只是静静地返回数据吗?
答案 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