2013-02-15 3 views
3

Я пытаюсь отправить содержимое файла клиенту в моем запросе, но единственная документация Express имеет функцию загрузки, которая требует физического файла; файл, который я пытаюсь отправить, поступает из 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

если вы сохраните файл локально вы можете использовать 'res.download' (http://expressjs.com/api .html # res.download) –

ответ

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.

EDIT: Фактически Express достаточно умен, чтобы подсчитывать длину контента для вас, поэтому вам не нужно добавлять заголовок Content-Length.

0

Это отличная ситуация для использования потоков. Используйте библиотеку 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