每次 post 调用在 aws s3 中上传图像时,唯一 ID(密钥)不会改变,因此会替换相同的图像

Unique id (key) not changing for every post call to upload the image in aws s3 and so replaces the same image

我正在创建一个 angular 应用程序,我从客户端发起一个 POST 调用。在服务器端,我使用 multer-sharp-s3 设置了路由,我在其中生成一个新名称(密钥)并在每次有呼叫时将其上传到 aws s3。

Angularhtml代码:

<form>
<input type="file" name='avatar' id="imageUploadInput" accept="image/*" #profilePicInput (change)="imageUpload(profilePicInput.files)" >
</form>

Angular 文件:

imageUpload(fileList:FileList){
    this.fileToUpload= fileList.item(0);
    let formData = new FormData();
    formData.append('avatar', this.fileToUpload, this.fileToUpload.name );
    this.userService.uploadDpImage(formData, this.currentUser).subscribe(
      (data:{Message:string, location:string})=>{
        this.userProfile.dpLocation=data.location;
      }
    )
  }

带有 multer 中间件的 Nodejs 路由:

router.post('/api/dpUpload/:displayName', middleWare.uploadToS3, (req,res)=>{
     User.findOneAndUpdate(
         {displayName: req.params.displayName},
         {$set:{dpLocation: req.file.Location}},
         (err,obj)=>{
             if(!err){
                return res.json({Message: "Image uploaded successfully", location:req.file.Location});
             }else{
                return res.json(err);
            }
         }
     )
})

Multer 中间件:

//S3 storage options
var multer = require('multer');
var s3Storage = require('multer-sharp-s3');
var aws = require('aws-sdk');
var fs = require('fs');
var nodeuuid = require('node-uuid');

aws.config.update({Bucket:'yaavarum-kelir-dev', region: 'us-east-2', accessKeyId: 'XXXXXXXXXXXX', secretAccessKey: 'XXXXXXXXXXXXX'});

s3 = new aws.S3();

var storage = s3Storage({
    s3,
    Bucket: 'yaavarum-kelir-dev',
    Key: `${'yaavarum-kelir-dev'}/DevContainer/${nodeuuid.v4()}`,
    ACL: 'public-read',
  });


middleWareObj.uploadToS3=multer({
    storage: storage,
}).single('avatar');

我面临的问题是,每次 post 调用时,图像都会以相同的名称上传到 aws s3,因此会替换图像而不是创建新文件。我不确定我做错了什么。

我每次都在 'storage' 变量中执行 'nodeuuid.v4()' 来生成一个新名称。但是,这个问题仍然存在。

有人可以帮忙吗?

我解决了这个问题,感谢这个答案:

中间件的正确实现:

middleWareObj.uploadToS3=multer({
    storage: s3Storage({
        s3,
        Bucket: 'yaavarum-kelir-dev',
        Key: function(req,file,cb){
            console.log(file);
            cb(null,nodeuuid.v4());
        },
        ACL: 'public-read',
      }),
}).single('avatar');