如何查找和修改在 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_typetype 组合时才能标识。因此,以下具有相同 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

如何将图像上传到 Cloudinary - MERN 堆栈

需要实现#cache!如果你想使用 Cloudinary::CarrierWave::Storage 作为缓存存储

如何使用java将图像上传到cloudinary中具有唯一public_id的特定文件夹?