Sử dụng mô-đun aws-sdk
và Express 4.13, có thể ủy quyền tệp từ S3 theo một số cách.Tệp trực tuyến từ S3 với Express bao gồm thông tin về độ dài và loại tệp
phiên bản callback này sẽ trở lại cơ thể tập như một bộ đệm, cộng với tiêu đề có liên quan khác như 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
});
}
Vấn đề với phiên bản này là bạn phải có được toàn bộ tập tin trước khi gửi đi, đó là không tuyệt vời, đặc biệt nếu nó lớn như một video.
Phiên bản này sẽ trực tiếp dòng file:
function(req,res){
var s3 = new AWS.S3();
s3.getObject({Bucket: myBucket, Key: myFile})
.createReadStream()
.pipe(res);
}
Nhưng không giống như người đầu tiên, nó sẽ không làm bất cứ điều gì về các tiêu đề, mà một trình duyệt có thể cần phải xử lý đúng đắn các tập tin.
Có cách nào để tận dụng tối đa cả hai thế giới, chuyển qua các tiêu đề chính xác từ S3 nhưng gửi tệp dưới dạng luồng không? Nó có thể được thực hiện bằng cách đầu tiên thực hiện một yêu cầu HEAD
tới S3 để nhận siêu dữ liệu, nhưng nó có thể được thực hiện với một cuộc gọi API không?
Điều này thật tuyệt vời. Cảm ơn! – matthoiland
Vì vậy, bạn muốn thực hiện hai yêu cầu HTTP thay vì một yêu cầu? –