3

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

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

例如:

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

2 回答 2

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标题。

于 2013-02-15T15:53:00.683 回答
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

于 2013-02-15T17:30:20.253 回答