节点amazon s3 putObject上传无法上传多个文件(只上传一个),但表示它有效

时间:2014-04-01 22:51:46

标签: node.js heroku amazon-web-services express amazon-s3

所以在我的路线中,我有一个帖子,可以让我发送一个多部分的帖子,然后保存到数据库,并将发布请求中附带的图片发送到亚马逊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对象中的最后一个文件。

2 个答案:

答案 0 :(得分:1)

问题不在于aws-sdk在fs.readfile中读取第一个文件之前,for循环一直在运行,解决方法在这里详细说明 Asynchronously reading and caching multiple files in nodejs

答案 1 :(得分:0)

我有一个类似的问题,有两个文件上传,我只是提到它为后代,以防有人在将来有一个类似的问题:我的图像上传没有嵌入for循环,但只是顺序调用s3 .putObject()。第一张图片会在页面刷新时显示正常,但第二张图片上传显示为“无声地失败”而无法正常工作。答案,事实证明,由于某种原因,第一个文件上传将更新缓存,但第二个图像上传不会更新缓存,因此看起来不起作用(即使实际文件传输到s3实际上正在工作)。如果您遇到问题,请尝试清除缓存,看看新上传是否真的有效但浏览器没有正常显示。