我正在try 从我当前的前端添加一个DeleteImage函数,该函数通过API路径与我的后端通信.下面是我用来上传图片的一个函数:

const uploadImages = async (ev) => {
    const files = ev.target?.files;
    if (files?.length > 0) {
      setIsUploading(true);
      const data = new FormData();
      for (const file of files) {
        data.append("file", file);
      }
      const res = await axios.post("/api/upload", data);
      setImages((oldImages) => {
        return [...oldImages, ...res.data.links];
      });
      setIsUploading(false);
    }
  };

下面是"ploadImages"函数与之通信的upad.js API路径:

import multiparty from "multiparty";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import fs from "fs";
import mime from "mime-types";

const bucketName = "ecommerce";

export default async function handle(req, res) {
  const form = new multiparty.Form();
  const { fields, files } = await new Promise((resolve, rejecct) => {
    form.parse(req, (err, fields, files) => {
      if (err) rejecct(err);
      resolve({ fields, files });
    });
  });
  console.log("length", files.file.length);
  const client = new S3Client({
    region: "us-west-1",
    credentials: {
      accessKeyId: process.env.S3_ACCESS_KEY,
      secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
    },
  });
  const links = [];
  for (const file of files.file) {
    const ext = file.originalFilename.split(".").pop();
    const newFilename = Date.now() + "." + ext;
    await client.send(
      new PutObjectCommand({
        Bucket: bucketName,
        Key: newFilename,
        Body: fs.readFileSync(file.path),
        ACL: "public-read",
        ContentType: mime.lookup(file.path),
      })
    );
    const link = `https://${bucketName}.s3.amazonaws.com/${newFilename}`;
    links.push(link);
  }

  return res.json({ links });
}

export const config = {
  api: { bodyParser: false },
};

我如何创建一个类似的函数来从我的Amazon S3存储桶中删除图像?我想我还需要创建一个"delete.js"API路径?或许不是呢?

谢谢各位编码员.

我try 了This,但它只从前端删除图像.我也需要将其从后端删除:

const deleteImage = (index) => {
    const updatedImages = [...images];
    updatedImages.splice(index, 1);
    setImages(updatedImages);
  };

推荐答案

在您的API中使用它从S3中删除文件,这里的关键字是您的文件名,Bucket是您的S3Bucket名称.

const params ={
    Bucket:process.env.AWS_BUCKET_NAME,
    Key:req.params.imageName
}
try {
    const data = await s3.send(new DeleteObjectCommand(params));
    return res.status(200).json({ success: data, status: true });
    // console.log("Success. Object deleted.", data);
    // return data; // For unit tests.
  } catch (err) {
    return res.status(404).json({ error: err, status: false  });
  }

Mongodb相关问答推荐

从MongoDB中的一个非空字段获取值

无法在Ubuntu 22.04上安装MongoDB 7.0

如何判断 mongodb 聚合,该文档具有键,该键是一个数组,其第二个元素是否存在?

mongo如何通过聚合加载嵌套文档

尽管前一阶段输出文档,$group stage 仍返回零文档

根据聚合管道MongoDB Atlas触发器中的条件更新多个字段

Mongo:投影不影响布尔值

创建索引需要很长时间

根据 Month 删除 mongodb 中的旧记录

将MongoDB连接到前端?

我怎样才能排序空值在 mongodb 中是最后排序的?

如何在mongoose中加入两个集合

如何使用 angular.js 推送通知?

在 mongodb 中的索引列上查找重复项的快速方法

在安装的 MongoDB homebrew 中设置 dbpath (Mac OS)

在 Ubuntu 13.10 (saucy) 中安装 Mongodb PHP 扩展的最简单方法?

处理Mongodb连接的正确方法是什么?

使用 mongoengine 将多文档插入到 mongodb

是否可以使用聚合框架对 MongoDB 中的 2 个字段求和?

将日期从毫秒转换为 ISODate 对象