Используя модуль aws-sdk
и Express 4.13, можно проксировать файл с S3 несколькими способами.
Эта версия обратного вызова вернет тело файла в виде буфера плюс другие соответствующие заголовки, такие как Content-Length
:
function(req,res){
var s3 = new AWS.S3();
s3.getObject({Bucket: myBucket, Key: myFile},function(err,data){
if (err) {
return res.status(500).send("Error!");
}
// Headers
res.set("Content-Length",data.ContentLength)
.set("Content-Type",data.ContentType);
res.send(data.Body); // data.Body is a buffer
});
}
Проблема с этой версией заключается в том, что вы должны получить весь файл перед его отправкой, что не очень удобно, особенно если оно что-то большое, как видео.
Эта версия будет напрямую передавать файл:
function(req,res){
var s3 = new AWS.S3();
s3.getObject({Bucket: myBucket, Key: myFile})
.createReadStream()
.pipe(res);
}
Но в отличие от первого, он ничего не сделает с заголовками, которые браузеру может понадобиться для правильной обработки файла.
Есть ли способ получить лучшее из обоих миров, проходя через правильные заголовки с S3, но отправляя файл как поток? Это можно сделать, сначала сделав запрос HEAD
на S3, чтобы получить метаданные, но может ли это быть сделано с помощью одного вызова API?