所以在我的路线中,我有一个帖子,可以让我发送一个多部分的帖子,然后保存到数据库,并将发布请求中附带的图片发送到亚马逊s3。 这是我的路线代码
exports.post = function(req, res){
var pictureNames = [];
var s3Bucket = new AWS.S3({params: {Bucket: 'anonybox'}});
for(key in req.files){
tp = req.files[key].path;
fn = req.files[key].name;
ftype = req.files[key].type;
pictureUrls.push(fn);
fs.readFile(tp, function(err, fileBuffer){
var params = {
Key: fn,
Body: fileBuffer,
ACL: 'public-read',
ContentType: ftype
};
s3Bucket.putObject(params, function(err, data){
if(err){
console.log("error" + err);
}else{
console.log("worked, data: "+JSON.stringify(data));
}
});
});
}
messageObject = {
message: req.body.message,
staytime: req.body.staytime,
picturenames: pictureNames
};
var postMessage = new MessageModel(messageObject);
postMessage.save(function(err, doc){
if(err || !doc){
throw 'Error';
}else{
console.log("created");
console.log(doc);
// res.json(doc);
}
});
当我尝试在post请求中发送两个图像时在控制台中,putObject函数返回:
worked, data: {"ETag":"\"24c1d19724ca10f40bc633aa29315931\""}
worked, data: {"ETag":"\"4201e2a997779c5595dc35925e954191\""}
但是只有一个文件显示在我的存储桶中的s3上,这是req.files对象中的最后一个文件。
答案 0 :(得分:1)
问题不在于aws-sdk在fs.readfile中读取第一个文件之前,for循环一直在运行,解决方法在这里详细说明 Asynchronously reading and caching multiple files in nodejs
答案 1 :(得分:0)
我有一个类似的问题,有两个文件上传,我只是提到它为后代,以防有人在将来有一个类似的问题:我的图像上传没有嵌入for循环,但只是顺序调用s3 .putObject()。第一张图片会在页面刷新时显示正常,但第二张图片上传显示为“无声地失败”而无法正常工作。答案,事实证明,由于某种原因,第一个文件上传将更新缓存,但第二个图像上传不会更新缓存,因此看起来不起作用(即使实际文件传输到s3实际上正在工作)。如果您遇到问题,请尝试清除缓存,看看新上传是否真的有效但浏览器没有正常显示。