2013-02-14 17 views
3

基本上我想有一個按鈕,人們可以點擊導出一些數據。目前,我已經聯繫到一個ajax調用,它會觸發服務器上的一些代碼以獲取數據。不幸的是,用戶從來沒有被提示保存文件或任何東西,該調用只是成功。如何使用Node.js和express來實現文件下載功能,以便提示用戶保存文件?

如果我查看對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

我寫了一個演示應用程序與此玩了一下:

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

相關問題