如何查找并修改Cloudinary中存储为private的资源?
解决方案
核心原因是Cloudinary的资源管理类接口默认仅查询type为upload的公有资源,私有资源的类型为private,未显式指定type参数时接口不会匹配私有资源,因此会返回不存在报错。
各接口修复方案
1. 单资源查询(api.resource)
调用时添加type: 'private'参数:
app.get('/api/v1/media/:folder/:id', (req, res) => { const { folder, id } = req.params // 新增第二个参数指定资源类型为私有 cloudinary.api.resource(`${folder}/${id}`, { type: 'private' }, (error, result) => { if (error) return console.log(error) return res.json(result) }); })
如果需要同时兼容公有、私有资源,可优先查询默认upload类型,查询失败后再查询private类型;也可在上传资源时将资源类型存储到自有数据库,操作时直接对应传入即可。
2. 单资源删除(uploader.destroy)
调用时添加type: 'private'参数:
app.delete('/api/v1/media/:publicId', (req, res) => { const { publicId } = req.params; // 新增第二个参数指定资源类型为私有 cloudinary.uploader.destroy('development/' + publicId, { type: 'private' }, (err, result) => { if (err) { console.log(err); return res.status(500).json(err); } return res.status(200).json(result) }) })
3. 批量删除(api.delete_resources)
如果需要同时删除公有、私有资源,有两种实现方案:
- 方案一:分两次调用,分别指定
type: 'upload'和type: 'private'删除对应类型的资源 - 方案二:传入type数组同时匹配两种类型(需Cloudinary Node SDK版本≥1.25.0)
app.delete('/api/v1/media', (req, res) => { const { publicIds } = req.body; // 新增第二个参数指定需要匹配的资源类型 cloudinary.api.delete_resources(publicIds, { type: ['upload', 'private'] }, (err, result) => { if (err) { console.log(err); return res.status(500).json(err); } return res.status(200).json(result) }) })
补充注意
如果你的私有资源不是图片类型(比如视频、文件),还需要额外传入resource_type参数,可选值为image/video/raw,接口默认值为image,类型不匹配也会返回找不到报错。
内容的提问来源于stack exchange,提问作者Jassar
相关产品推荐
相关产品推荐

