node.js - 每次发布调用以在 aws s3 中上传图像时,唯一 ID(键)都不会更改,因此会替换相同的图像
问题描述
我正在创建一个角度应用程序,我从客户端发起一个 POST 调用。在服务器端,我使用 multer-sharp-s3 设置路由,在其中生成一个新名称(密钥)并在每次有呼叫时将其上传到 aws s3。
角度html代码:
<form>
<input type="file" name='avatar' id="imageUploadInput" accept="image/*" #profilePicInput (change)="imageUpload(profilePicInput.files)" >
</form>
角ts文件:
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');
我面临的问题是,每次来电后,图像都会以相同的名称上传到 aws s3,因此会替换图像而不是创建新文件。我不确定我做错了什么。
我每次都在“storage”变量中执行“nodeuuid.v4()”来生成一个新名称。但是,这个问题仍在发生。
有人可以帮忙吗?
解决方案
我解决了这个问题,感谢这个答案:
https://stackoverflow.com/a/40950313/7999756
中间件的正确实现:
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');
推荐阅读
- reactjs - React Native 中的响应式图像
- sql - 如何在 Access 中选择两个日期之间的记录?
- java - 字谜 - 我怎样才能通过以下两个测试用例
- laravel - 如何将cookie从后端(laravel)发送到前端?
- python - 如何在不使用 REGEX 的情况下删除具有特定模式的字符串?
- java - 如何将二维阵列板转换为等距板
- clang - clang 7.0.0 windows 不包括 LLDB 吗?
- android - 无法使用 fopen() 打开文件。fprintf 在 android ndk 中崩溃
- php - 如何从输出流访问 php 中的 json?
- angular - Angular - 带有回调的承诺