2013-02-15 97 views
3

我想在我的請求中向客戶端發送文件內容,但唯一的文檔是它的下載功能,它需要一個物理文件;我試圖發送的文件來自S3,所以我擁有的是文件名和內容。Nodejs Express發送文件

我該如何着手發送文件的內容以及適當的標題內容類型和文件名以及文件內容?

例如:

files.find({_id: id}, function(e, o) { 
    client.getObject({Bucket: config.bucket, Key: o.key}, function(error, data) { 
    res.send(data.Body); 
    }); 
}); 
+0

的護理的.html#res.download) – 2015-08-26 20:26:05

回答

7

文件的類型取決於文件明顯。看看這個:

http://en.wikipedia.org/wiki/Internet_media_type

如果你知道究竟是你的文件,然後分配這些一個響應(雖然不是強制)。您還應該將文件的長度添加到響應中(如果可能,即不是流)。如果您希望它可作爲附件下載,請添加Content-Disposition標題。因此,總而言之,您只需添加以下內容:

var filename = "myfile.txt"; 
res.set({ 
    "Content-Disposition": 'attachment; filename="'+filename+'"', 
    "Content-Type": "text/plain", 
    "Content-Length": data.Body.length 
}); 

注意:我正在使用Express 3.x.

編輯:實際上,Express的智能足以爲您計算內容長度,因此您不必添加Content-Length標題。

0

這是使用流的好方法。使用knox庫來簡化事情。如果要存儲的文件在本地就可以使用`res.download`(http://expressjs.com/api諾克斯應採取必要的頭管道文件設置爲客戶

var inspect = require('eyespect').inspector(); 
var knox = require('knox'); 
var client = knox.createClient({ 
    key: 's3KeyHere' 
    , secret: 's3SecretHere' 
    , bucket: 's3BucketHer' 
}); 
/** 
* @param {Stream} response is the response handler provided by Express 
**/ 
function downloadFile(request, response) { 
    var filePath = 's3/file/path/here'; 
    client.getFile(filePath, function(err, s3Response) { 
    s3Response.pipe(response); 
    s3Response.on('error', function(err){ 
     inspect(err, 'error downloading file from s3'); 
    }); 

    s3Response.on('progress', function(data){ 
     inspect(data, 's3 download progress'); 
    }); 
    s3Response.on('end', function(){ 
     inspect(filePath, 'piped file to remote client successfully at s3 path'); 
    }); 
    }); 
} 

npm install knox eyespect