3

基本上我想要一个按钮,人们可以点击它来导出一些数据。目前,我已将此连接到一个 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')

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

4

1 回答 1

4

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

应用程序.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...')
});

你好.json

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

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

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

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

您可以在此处查看更多信息:流式传输 PDF 附件时如何强制使用另存为对话框

于 2013-02-14T20:32:18.810 回答