如何查找和修改在 Cloudinary 中存储为 "private" 的资产?
How do I find and modify assets that were stored as "private" in Cloudinary?
我将我的 Node.js 项目连接到 Cloudinary,我能够成功地将 public 和私有资产上传到 cloudinary 中的同一个文件夹,我将其命名为“development”。
我认为 development/id
是预期的 publicId,它适用于 public 资产。
但是,对于私有资产,这不起作用。除了 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
删除资源
在这个例子中,我在同一个请求中包含私有和 public 资产。 public 一个有效,私人的没有。
要求:
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
}
我错过了什么?
谢谢
在 Cloudinary 中,资产 unique/identified 不仅是 public_id
,而且仅当与 resource_type
和 type
组合时。因此,以下具有相同public_id(sample
)的资产实际上是不同的实体:
image/upload/sample
image/private/sample
video/upload/sample
video/authenticated/sample
API 方法默认某些可选参数的值(如果未提供)。这包括 'resource_type'(默认为“图片”)和 'type'(默认为“上传”)。
在您的情况下,由于您正在尝试 search/delete 私有图像,因此您需要显式传递 'type' 参数并将其值设置为 'private'。否则,当前将发生的是您的代码将尝试删除正确的 public_id,但是,它将默认为 'upload' 的 'type',因此找不到您要查找的文件.这就是它找到“上传”资产而不是“私有”资产的原因。
如果与默认值不同,您需要在请求中包含特定的 type/resource_type。在这里,您需要在所有示例 API 调用中传递 "type": "private"
。
我将我的 Node.js 项目连接到 Cloudinary,我能够成功地将 public 和私有资产上传到 cloudinary 中的同一个文件夹,我将其命名为“development”。
我认为 development/id
是预期的 publicId,它适用于 public 资产。
但是,对于私有资产,这不起作用。除了 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
删除资源在这个例子中,我在同一个请求中包含私有和 public 资产。 public 一个有效,私人的没有。
要求:
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
}
我错过了什么? 谢谢
在 Cloudinary 中,资产 unique/identified 不仅是 public_id
,而且仅当与 resource_type
和 type
组合时。因此,以下具有相同public_id(sample
)的资产实际上是不同的实体:
image/upload/sample
image/private/sample
video/upload/sample
video/authenticated/sample
API 方法默认某些可选参数的值(如果未提供)。这包括 'resource_type'(默认为“图片”)和 'type'(默认为“上传”)。
在您的情况下,由于您正在尝试 search/delete 私有图像,因此您需要显式传递 'type' 参数并将其值设置为 'private'。否则,当前将发生的是您的代码将尝试删除正确的 public_id,但是,它将默认为 'upload' 的 'type',因此找不到您要查找的文件.这就是它找到“上传”资产而不是“私有”资产的原因。
如果与默认值不同,您需要在请求中包含特定的 type/resource_type。在这里,您需要在所有示例 API 调用中传递 "type": "private"
。