我将我的Node.js项目连接到cloudary,我能够成功地将公共和私有资产上传到cloudary的同一文件夹中,我将其命名为"development"。
我认为development/id
是预期的publicId,这对公共资产有效。
然而,对于私人资产,这不起作用。除了development/id
路径,我还尝试了image/private/s--KEYHERE--/v123456789/development/publicIdOfPrivateAsset'
的每个级别,但我最终得到了resource not found error
(下面列出了错误的变化)
const multer = require('multer')
// Defined in .env: CLOUDINARY_URL=cloudinary://my_key:my_secret@my_cloud_name
const cloudinary = require('cloudinary').v2
const { CloudinaryStorage } = require('multer-storage-cloudinary');
const CLOUDINARY_FOLDER = "development"
const storage = new CloudinaryStorage({
cloudinary: cloudinary,
params: {
folder: CLOUDINARY_FOLDER,
// type: 'private' // Used for creating the private asset
},
});
const upload = multer({ storage: storage });
app.post('/api/v1/media', upload.single('image'), (req, res) => {
return res.json({ image: req.file.path });
})
使用api.resource
获取资产http://localhost:5000/api/v1/media/development/publicIdOfPrivateAsset
app.get('/api/v1/media/:folder/:id', (req, res) => {
const { folder, id } = req.params
cloudinary.api.resource(`${folder}/${id}`, (error, result) => {
if (error) return console.log(error)
return res.json(result)
});
})
反应
{
message: 'Resource not found - development/publicIdOfPrivateAsset',
http_code: 404
}
使用uploader.destroy
销毁资源http://localhost:5000/api/v1/media/publicIdOfPrivateAsset
app.delete('/api/v1/media/:publicId', (req, res) => {
const { publicId } = req.params;
cloudinary.uploader.destroy('development/' + publicId, (err, result) => {
if (err) { console.log(err); return res.status(500).json(err); }
return res.status(200).json(result)
})
})
反应:
{
"result": "not found"
}
使用api.delete_resources删除资源
在这个例子中,我在同一个请求中包含了私有和公共资产。公共的工作,私人的没有。要求:http://localhost:5000/api/v1/media
身体:
{
"publicIds": [
"development/publicIdOfPublicAsset",
"development/publicIdOfPrivateAsset"
]
}
node . js
app.delete('/api/v1/media', (req, res) => {
const { publicIds } = req.body;
cloudinary.api.delete_resources(publicIds, (err, result) => {
if (err) { console.log(err); return res.status(500).json(err); }
return res.status(200).json(result)
})
})
反应:
{
"deleted": {
"development/publicIdOfPublicAsset": "deleted",
"development/publicIdOfPrivateAsset": "not_found"
},
"deleted_counts": {
"development/publicIdOfPublicAsset": {
"original": 1,
"derived": 0
},
"development/publicIdOfPrivateAsset": {
"original": 0,
"derived": 0
}
},
"partial": false,
"rate_limit_allowed": 500,
"rate_limit_reset_at": "2021-10-17T14:00:00.000Z",
"rate_limit_remaining": 494
}
我错过了什么?谢谢你
在cloudary中,资产不仅是public_id
唯一的/识别的,而且只有在与resource_type
和type
结合时才能识别。因此,以下具有相同public_id (sample
)的资产实际上是不同的实体:
image/upload/sample
image/private/sample
video/upload/sample
video/authenticated/sample
API方法默认某些可选参数的值(如果没有提供)。这包括'resource_type'(默认为"image")和'type'(默认为"upload")。
在你的情况下,因为你试图搜索/删除一个私有图像,你需要显式地传递'type'参数并将其值设置为'private'。否则,当前将发生的情况是,您的代码将尝试删除正确的public_id,然而,它将默认为"上传"的"类型",因此找不到您正在寻找的文件。这就是为什么它会找到"upload"资产而不是"私人"资产。一。
如果与默认值不同,则需要在请求中包含特定的类型/resource_type。这里,您需要在所有示例API调用中传递"type": "private"
。