从云端删除原始图像

Posted

技术标签:

【中文标题】从云端删除原始图像【英文标题】:Delete original image from cloudinary 【发布时间】:2021-09-04 12:38:16 【问题描述】:

我正在使用带有 node 和 multer 的 cloudinary 我成功地存储了图像,但我注意到每次上传图像时它都会创建两个副本:一个以 public_id 作为名称(在资产中),另一个以原始名称(在“配置文件”文件夹中)。

每当我上传新图片时,我都想删除这两个图片,但它只会删除资产中的那个,而不会删除“个人资料”图片中的那个。

我的上传路径是这样的

import path from "path";
import express from "express";
import dotenv from "dotenv";
import cloudinary from "cloudinary";
import  CloudinaryStorage  from "multer-storage-cloudinary";
import multer from "multer";

dotenv.config();

const cloud = cloudinary.v2;
const router = express.Router();

cloud.config(
  cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
  api_key: process.env.CLOUDINARY_API_KEY,
  api_secret: process.env.CLOUDINARY_API_SECRET,
);

const storage = new CloudinaryStorage(
  cloudinary: cloud, 
  params: 
    folder: "profiles",
    transformation:  gravity: "center", height: 300, width: 300, crop: "fill" ,
    public_id: (req, file) =>
      `$file.originalname.split(".")[0]-$Date.now()`,
  ,
);

function checkFileType(file, cb) 
  const filetypes = /jpg|jpeg|png/;
  const extname = filetypes.test(
    path.extname(file.originalname).toLocaleLowerCase()
  );
  const mimetype = filetypes.test(file.mimetype);
  if (extname && mimetype) 
    return cb(null, true);
   else 
    cb(null, false);
  


const upload = multer(
  storage,
  fileFilter: function (req, file, cb) 
    checkFileType(file, cb);
  ,
);

router.post("/", upload.single("image"), async (req, res) => 
  try 
    const result = await cloud.uploader.upload(req.file.path)
    res.send(result);
   catch(error) 
    console.log(error)
  
);

export default router;

还有删除路线

import express from "express";
import dotenv from "dotenv";
import cloudinary from "cloudinary";

dotenv.config();

const cloud = cloudinary.v2;
const router = express.Router();

cloud.config(
  cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
  api_key: process.env.CLOUDINARY_API_KEY,
  api_secret: process.env.CLOUDINARY_API_SECRET,
);

router.post('/:id', async (req, res) =>
    try 
        await cloud.uploader.destroy(req.params.id);
        // await cloud.uploader.destroy(`/profiles/$req.params.id`);

        res.send(result);
     catch (err) 
        return res.status(500).json(msg: err.message)
    
    
)

export default router;

谁能帮忙?

【问题讨论】:

Cloudinary 只支持一次上传,只需调用一次上传 API,我在代码中只看到一篇帖子,所以我不确定它是如何上传两次的。如果您想删除多个图像,则可以通过传递它们唯一的 public_id 并为每个图像调用销毁 API 来执行此操作。由于这两个上传的文件具有不同的 public_id(如果资源在文件夹中,public_id 还包括文件夹名称),您必须使用唯一名称调用 destroy API 两次才能删除这两个文件。 【参考方案1】:

如果有人遇到同样的问题 我在上传路线中发送了两次图像 改成这个就行了

router.post("/", upload.single("image"), async (req, res) => 
  try 
    res.json(req.file);
   catch (error) 
    console.log(error);
  
);

【讨论】:

以上是关于从云端删除原始图像的主要内容,如果未能解决你的问题,请参考以下文章

将多标签图像从云端硬盘上传到 Google Colab

如何将图像从本地存储上传到云端?

通常无法将图像从前端发送到云端或后端

避免使用云端未签名图像上传自动上传?

自动从Google云端硬盘中删除文件

从Google云端硬盘文件夹中删除旧文件