【发布时间】:2020-12-18 13:19:44
【问题描述】:
我可以使用 multer-storage-cloudinary 包成功上传图像,但我还没有拼凑出如何从我的更新或删除路由中销毁 cloudinary 中的图像的实现。我发现的所有资源仅参考上传图片。这是我必须上传的图片
const cloudinary = require('cloudinary').v2;
const { CloudinaryStorage } = require('multer-storage-cloudinary');
const multer = require('multer');
cloudinary.config({
cloud_name: process.env.CLOUD_NAME,
api_key: process.env.API_KEY,
api_secret: process.env.API_SECRET
});
const storage = new CloudinaryStorage({
cloudinary: cloudinary,
params: {
folder: "works",
allowedFormats: ["jpg", "png"]
}
});
const imgUpload = multer({ storage: storage });
router.post('/', withAuth, imgUpload.single('work-img'), (req, res) => {
console.log(req.file);
Post.create({
title : req.body.title,
dimension : req.body.dimensions,
description : req.body.description,
media : req.body.media,
img_url : req.file.path,
user_id : req.session.user_id
})
.then((dbPostData) => res.json(dbPostData))
.catch((err) => {
console.log(err);
res.status(500).json(err);
});
});
这是处理表单提交的前端代码
async function newFormHandler(event) {
event.preventDefault();
const form = document.querySelector('#new-post-form');
const formData = new FormData(form);
const response = await fetch(`/api/posts`, {
method : 'POST',
body : formData
});
if (response.ok) {
document.location.replace('/dashboard');
} else {
alert(response.statusText);
}
}
document.querySelector('#new-post-form').addEventListener('submit', newFormHandler);
最后是我的更新路线,用于上传新图像并将其保存到数据库的新路径,但我也想从 Cloudinary 中删除旧图像,这样我就不会在那里建立未使用的工件。
router.put('/:id', withAuth, imgUpload.single('work-img'), (req, res) => {
Post.update(
{
title : req.body.title,
dimension : req.body.dimensions,
description : req.body.description,
media : req.body.media,
img_url : req.file.path
},
{
where : {
id : req.params.id
}
}
)
.then((dbPostData) => {
if (!dbPostData) {
res.status(404).json({ message: 'No post found with this id' });
return;
}
res.json(dbPostData);
})
.catch((err) => {
console.log(err);
res.status(500).json(err);
});
});
如果我在 post 路由中查看 console.log(req.file),它会给我类似的东西
{
fieldname: 'work-img',
originalname: '20171005_134508.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
path: 'https://res.cloudinary.com/xxxxxxxxx/image/upload/xxxxxxxx/works/ujrrf13kyil8l5rjccwf.jpg',
size: 3647252,
filename: 'works/ujrrf13kyil8l5rjccwf'
}
{
"public_id": "eneivicys42bq5f2jpn2",
"version": 1570979139,
"signature": "abcdefghijklmnopqrstuvwxyz12345",
"width": 1000,
"height": 672,
"format": "jpg",
"resource_type": "image",
"created_at": "2017-08-11T12:24:32Z",
"tags": [],
"bytes": 350749,
"type": "upload",
"etag": "5297bd123ad4ddad723483c176e35f6e",
"url": "http://res.cloudinary.com/demo/image/upload/v1570979139/eneivicys42bq5f2jpn2.jpg",
"secure_url": "https://res.cloudinary.com/demo/image/upload/v1570979139/eneivicys42bq5f2jpn2.jpg",
"original_filename": "sample",
"eager": [
{ "transformation": "c_pad,h_300,w_400",
"width": 400,
"height": 300,
"url": "http://res.cloudinary.com/demo/image/upload/c_pad,h_300,w_400/v1570979139/eneivicys42bq5f2jpn2.jpg",
"secure_url": "https://res.cloudinary.com/demo/image/upload/c_pad,h_300,w_400/v1570979139/eneivicys42bq5f2jpn2.jpg" },
然后我可以像这样将'public_id'与destroy方法一起使用,但我无权访问public_id来配置它:cloudinary.v2.uploader.destroy(public_id, options, callback);
我不清楚如何实现这一点,或者是否可以使用 multer-storage-cloudinary 包
【问题讨论】:
标签: node.js express multer cloudinary