Nodejs Express发送文件

时间:2013-02-15 15:31:53

标签: node.js amazon-web-services express

我正在尝试在我的请求中将文件的内容发送到客户端,但Express的唯一文档是它的下载功能需要物理文件;我试图发送的文件来自S3,所以我只有文件名和内容。

如何发送文件内容以及内容类型和文件名的相应标题以及文件内容?

例如:

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

2 个答案:

答案 0 :(得分: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标题。

答案 1 :(得分:0)

使用流是一种很好的情况。使用knox库简化操作。 Knox应该负责将所需的头文件设置为管道文件到客户端

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