我已经安装了multer,multer-s3和aws-sdk,并尝试上传个人资料图片,当用户上传个人资料图片。
到目前为止,我有下面的代码在一个文件中调用file_upload.js。
const aws = require('aws-sdk')
const multer = require('multer')
const multerS3 = require('multer-s3')
aws.config.update({
secretAccessKey: "my access key",
accessKeyId: "my key id",
region: "us-east-2"
})
const s3 = new aws.S3()
const upload = multer({
storage: multerS3({
s3: s3,
bucket: 'user-image1',
acl: 'public-read',
metadata: function (req, file, cb) {
cb(null, {fieldName: 'TESTING-META-DATA'});
},
key: function (req, file, cb) {
cb(null, Date.now().toString())
}
})
})
module.exports = upload
和一个帖子请求,当用户选择一些输入
const upload = require('../assets/file-upload')
const singleUpload = upload.single('image')
router.post("/edit/:id", (req, res) => {
User.findByIdAndUpdate(
{ _id: id },
{
$set: {
education: req.body.education,
language: req.body.language,
bio: req.body.bio,
image_file: req.body.image_file
},
},
{ new: true },
(err, result) => {
res.redirect("/dashboard");
}
);
});
在我的ejs中,除了图片,所有的字符串输入都能正确处理。
<div class="upload-btn-img">
<input type="file" name="image_file" onchange="showThumbnail(this)" />
</div>
我的问题是,如何保存照片和其他所有的输入数据?所有其他的输入数据都存储在mongodb atlas中,而图片需要存储在amazon s3中。
你需要一个中间件,拦截请求并将文件发送到s3,然后返回url。
这里是一个例子,我做了一段时间,这是 --控制器 https:/github.comC0D1NGD0J0weareunited4lifeblobmasterappControllersupload.js。)
--Routerouter.post("", passport.authenticate('jwt', {session: false}), uploadImg, postCntrl.create)。
注意 "uploadImg "中间件,它必须在保存文档的控制器动作之前。