如何查找和修改在 Cloudinary 中存储为“私有”的资产?
Posted
技术标签:
【中文标题】如何查找和修改在 Cloudinary 中存储为“私有”的资产?【英文标题】:How do I find and modify assets that were stored as "private" in Cloudinary? 【发布时间】:2021-12-04 21:34:52 【问题描述】:我将我的 Node.js 项目连接到 Cloudinary,我能够成功地将公共和私有资产上传到 cloudinary 中的同一文件夹,我将其命名为“开发”。
我认为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
我错过了什么? 谢谢
【问题讨论】:
【参考方案1】:在 Cloudinary 中,资产是唯一的/不仅由 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”)。
在您的情况下,由于您尝试搜索/删除私有图像,您需要显式传递“类型”参数并将其值设置为“私有”。否则,当前会发生的情况是您的代码将尝试删除正确的 public_id,但是,它将默认为“上传”的“类型”,因此找不到您要查找的文件。这就是它找到“上传”资产而不是“私有”资产的原因。
如果它们与默认值不同,您需要在请求中包含特定类型/资源类型。在这里,您需要在所有示例 API 调用中传递 "type": "private"
。
【讨论】:
以上是关于如何查找和修改在 Cloudinary 中存储为“私有”的资产?的主要内容,如果未能解决你的问题,请参考以下文章
使用 multer-storage-cloudinary 存储在两个不同的文件夹中
Cloudinary::CarrierWave 如何在 Cloudinary 中选择上传文件夹
如何将表单数据和此 URL 保存到数据库中.. 我可以将文件上传到 cloudinary