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

私はこれで少し遊ぶためのデモアプリを書きました:

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-DispositionHTTPサーバーヘッダーをに設定していますattachment。Firefoxなどの一部のブラウザでは、「名前を付けて保存」するように求められます。ChromeとSafariはデフォルトではありません。ただし、このデフォルトの動作は、ChromeまたはSafariのいずれかのオプションで変更できます。InternetExplorerではテストしていません。

を変更してContent-Type、動作がオーバーライドされるかどうかを確認しようとしましたが、オーバーライドされません。

つまり、ユーザーの設定を上書きすることはできません。

詳細については、こちらをご覧ください:PDF添付ファイルをストリーミングするときに[名前を付けて保存]ダイアログを強制する方法

于 2013-02-14T20:32:18.810 に答える