gpt4 book ai didi

javascript - 多个文件上传到 s3 node.js

转载 作者:行者123 更新时间:2023-11-30 14:27:12 25 4
gpt4 key购买 nike

我正在开发 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);}
});
});
}

};

问题: 文件上传是异步的,例如,如果我上传的 file1honest.jpg 那么我想要 multipleUploadToS3 方法在完成上传到 S3 后返回文件名。我将其绑定(bind)到 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 次。

有两种方法可以解决你面临的问题

  1. 您可以使用递归。
  2. 使用neo-async(async-parallel) 库来控制javascript(Nodejs) 的异步流程。 click here for neo-async lib

希望这能消除您的疑虑。请发表评论以获取更多信息。

关于javascript - 多个文件上传到 s3 node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51745291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com