[英]Multiple file upload to s3 node.js
我正在開發 MEAN 堆棧應用程序,並且正在使用 AWS SDK 將多個文件上傳到 S3。 我正在使用 busboy 和 AWS SDK。
代碼:
var inputObj = {};
var busboy = new Busboy({ headers: req.headers });
// The file upload has completed
busboy.on('finish', function() {
console.log('Upload finished.....');
var file = [];
const file1 = req.files.clogo;
const file2 = req.files.cbanner1;
const file3 = req.files.cbanner2;
const file4 = req.files.cbanner3;
const file5 = req.files.cbanner4;
const file6 = req.files.clongHeader;
file.push(file1);
file.push(file2);
file.push(file3);
file.push(file4);
file.push(file5);
file.push(file6);
multipleUploadToS3(req.body.cname, file, function(fileName) {
console.log("client file upload finished.....");
if(fileName.length == 6){
inputObj.clogo = fileName[0];
inputObj.cbanner1 = fileName[1];
inputObj.cbanner2 = fileName[2];
inputObj.cbanner3 = fileName[3];
inputObj.cbanner4 = fileName[4];
inputObj.clongHeader = fileName[5];
console.log(inputObj);
var clientObj = new client(inputObj);
clientObj.save(function(err, client) {
console.log("Client Saved.....");
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(client);
}
});
}
});
});
req.pipe(busboy);
文件上傳方式:
function multipleUploadToS3(client, file, callback) {
console.log("multipleUpload to S3");
console.log(client);
console.log(file);
let s3bucket = new AWS.S3({
accessKeyId: IAM_USER_KEY,
secretAccessKey: IAM_USER_SECRET,
Bucket: BUCKET_NAME,
});
var fileNames = [];
for(var i=0; i<file.length; i++){
s3bucket.createBucket(function () {
var params = {
Bucket: BUCKET_NAME,
Key: client+ '/' + file[i].name,
Body: file[i].data,
};
s3bucket.upload(params, function (err, data) {
if (err) {
console.log('error in callback');
console.log(err);
}
console.log('success');
//console.log(data.key);
fileNames.push(data.key);
if(i == file.length){ callback(fileNames);}
});
});
}
};
問題:文件上傳是異步的,例如,如果我上傳的文件1 是誠實的.jpg,那么我希望multipleUploadToS3方法在上傳到 S3 后返回文件名。 我將其綁定到inputObj鍵中,該鍵將保存到mongo db 。 所以inputObj.logo 中應該有logo.png而不是由於異步調用而發生的橫幅圖像。
這對單個文件有效,但對多個文件無效。
問題是因為 for 循環是同步的,而文件上傳是異步的。
看看下面這個例子,
for(var i = 0; i<5;i++) {
setTimeout(function(){ console.log(i); }, 100);
}
上面的循環將打印 5 次 5 次,即 55555。
這種行為是因為 for 循環立即執行,使 i=5 並且當超時被執行時,它會打印“i”值 5 5 次。 5 次,因為 setTimeout 被推入隊列 5 次。
有兩種方法可以解決您面臨的問題
希望這可以消除您的疑慮。 請評論以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.