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