Amazon S3存储桶文件上载响应不可用

时间:2018-04-06 16:05:12

标签: node.js amazon-s3 multer multer-s3 s3-bucket

我正在使用 multer aws-sdk multer-s3 包以及快递。

当用户编辑个人资料时,用户可能会更改个人资料图片/头像。

我已经通过了multer对象

  

multer({存储:   multer.memoryStorage()})。single('profileHeroImageEdit')

如果有当前请求的文件,那么我会将文件上传到s3存储桶,但我没有收到 upload_replace 的任何响应,其中 req.file.location 将提供S3桶的url(文件的位置)。 在 upload_replace 内部,我可以获取我尝试上传的文件( req.file ),但我希望上传文件的位置为S3存储桶。

我缺少什么?帮助将不胜感激

router.put("/:id",multer({ storage: 
multer.memoryStorage()}).single('profileHeroImageEdit'), 
middleware.checkProfileOwnership,function(req, res){
    if(isFileExists(req)==false){
        delete req.body.profileHeroImage      

     }
     else{
         console.log('file has')
         var upload_replace = multer({
            limits:{
                fileSize:MAX_FILE_SIZE,
                files:1
            },
            storage: multerS3({
                s3: photoBucket,
                bucket: BucketName,
                acl: 'public-read',
                metadata: function (req, file, cb) {
                    cb(null, { fieldName: file.fieldname });
                },
                key: function (req, file, cb) {
                    cb(null,Date.now().toString())

                }
            })
        }).single('profileHeroImageEdit') 

        upload_replace(req, res, function (err,log) {
           console.log('request log')
            console.log(req.file.location)
           console.log()
        }); 


     }
    Profile.findByIdAndUpdate(req.params.id, req.body.profile, function(err, updatedProfile){
        if (err){
            res.redirect("/profiles");
        } else {
            res.redirect("/profiles/" + req.params.id);
        }
    });
});

function isFileExists(request){
    if(request.file)
    {
        return true 
    }
    else{
        return false
    }
}

2 个答案:

答案 0 :(得分:1)

我有使用multer和aws-sdk的完整代码

  1. 包括此文件,然后npm全部安装

    //aws s3 packages
    const aws = require("aws-sdk");
    const multerS3 = require("multer-s3");
    const multer = require("multer");
    const path = require("path");
    
  2. 然后

    //profile image upload start
    const s3 = new aws.S3({
      accessKeyId: "***",
      secretAccessKey: "***",
      Bucket: "***"
    });
    
    //Singe profile image upload
    
    const profileImgUpload = multer({
      storage: multerS3({
        s3: s3,
        bucket: "***",
        acl: "public-read",
        key: function(req, file, cb) {
          cb(
            null,
            path.basename(file.originalname, path.extname(file.originalname)) +
              "-" +
              Date.now() +
              path.extname(file.originalname)
          );
        }
      }),
      limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
      fileFilter: function(req, file, cb) {
        checkFileType(file, cb);
      }
    }).single("profileImage");
    
    // getExtension of file by this function
    function getExtension(filename) {
      var parts = filename.split(".");
      return parts[parts.length - 1];
    }
    
    //checkfile type of input function
    function checkFileType(file, cb) {
      const ext = getExtension(file.originalname);
      switch (ext.toLowerCase()) {
        case "jpeg":
        case "jpg":
        case "png":
        case "gif":
          return cb(null, true);
      }
      cb("Error: Images Only!");
    }
    
    router.post(
      "/image",
      passport.authenticate("jwt", { session: false }),
      (req, res) => {
        profileImgUpload(req, res, error => {
          if (error) {
            res.json({ error: error });
          } else {
            //here we can get req.body
            const userDp = {};
    
            //end of getting values
    
            // If File not found then dont store anything
            if (req.file !== undefined) userDp.dpUrl = req.file.location;
            // Save the file name into database into profile model
    
            User.findOne({ email: req.user.email }).then(user => {
              if (user) {
                // Update
                User.findOneAndUpdate(
                  { email: req.user.email },
                  { $set: userDp },
                  { new: true }
                ).then(user => res.json(user));
              } else {
                res.json({ msg: "not able not update data" });
              }
            });
          }
        });
      }
    );
    

3。需要使用

从反应前端发送数据
const data = new Formdata();
data.append()

,并且还包括标头

答案 1 :(得分:0)

添加一个侦听器,用于完成将照片上传到S3的OutgoingMessage。 on-finished库对此非常方便。

const onFinished = require('on-finished');
const print = process._rawDebug;

uploadReplace(req, null, function (err) {
  onFinished(req, function () {
    if (err) print(err);
    print(req.file.location);
    // Other things can be done here
  })
});