Korzystając z modułu aws-sdk
i Express 4.13, możliwe jest proxy pliku z S3 na kilka sposobów.Przesyłanie strumieniowe pliku z S3 z Expressem, w tym informacje o długości i rodzaju pliku
Ta wersja zwrotna powróci ciało pliku jako bufor, a także innych właściwych nagłówków jak 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
});
}
Problem z tej wersji jest to, że trzeba się cały plik przed wysłaniem, co jest nie świetne, zwłaszcza jeśli jest to coś dużego jak wideo.
Wersja ta będzie bezpośrednio przesyłać plik:
function(req,res){
var s3 = new AWS.S3();
s3.getObject({Bucket: myBucket, Key: myFile})
.createReadStream()
.pipe(res);
}
Ale w przeciwieństwie do pierwszego, to nie będzie nic o nagłówkach, które mogą potrzebować, aby prawidłowo obsłużyć plik przeglądarka zrobić.
Czy istnieje sposób, aby uzyskać najlepsze z obu światów, przechodząc przez odpowiednie nagłówki z S3, ale wysyłając plik jako strumień? Można to zrobić, najpierw wysyłając żądanie S3, aby uzyskać metadane, ale czy można to zrobić za pomocą jednego wywołania API?
To jest doskonałe. Dzięki! – matthoiland
Więc wolisz dwa żądania HTTP zamiast jednego? –