【问题标题】:How to delete a file image on amazon s3 when如何在亚马逊 s3 上删除文件图像
【发布时间】:2021-11-19 02:33:53
【问题描述】:

我有一个程序模型,我的程序有一个图像属性,我在创建程序时使用 multers3 上传。

我现在面临的挑战是,当我删除程序时,本地计算机上的所有内容都会被删除,但我意识到文件(图像)仍然存在于我的 Aws s3 控制台上。如何在我的数据库和 Amazon s3 上删除文件?

Here are my Program routes

这就是我删除程序的方式

router.delete("/:id/delete", function (req, res) {
  const ObjectId = mongoose.Types.ObjectId;
  let query = { _id: new ObjectId(req.params.id) };

   Program.deleteOne(query, function (err) {
    if (err) {
       console.log(err);
     }
    res.send("Success");
  });
});

这就是我创建程序的方式。

  router.post("/create", upload.single("cover"), async (req, res, next) => {
    const fileName = req.file != null ? req.file.filename : null;
    const program = new Program({
      programtype: req.body.programtype,
      title: req.body.title,
      description: req.body.description,
      programImage: req.file.location,
   });
 try {
   console.log(program);
   const programs = await program.save();
   res.redirect("/programs");
  } catch {
   if (program.programImage != null) {
    removeprogramImage(program.programImage);
  }
  res.render("programs/new");
 }
});

【问题讨论】:

    标签: node.js express multer-s3


    【解决方案1】:

    查看 Multer-s3 存储库,我找不到任何提到从 s3 中删除的内容。源码里面有this function,但是不知道怎么用。

    您可以尝试通过deleteObject 直接使用 AWS 开发工具包:

    const s3 = new aws.S3({
        accessKeyId: 'access-key-id',
        secretAccessKey: 'access-key',
        Bucket: 'bucket-name',
    });
    
    s3.deleteObject({ Bucket: 'bucket-name', Key: 'image.jpg' }, (err, data) => {
        console.error(err);
        console.log(data);
    });
    

    【讨论】:

      【解决方案2】:

      我遇到了完全相同的问题,即“文件(图像)仍然存在于我的 Aws s3 控制台上”这可能是因为传递了图像位置而不是图像名称 将图像上传到 aws 时,这是响应

      {
        fieldname: 'name',
        originalname: 'apple.png',
        encoding: '7bit',
        mimetype: 'image/png',
        size: 59654,
        bucket: 'my-bucket-name',
      key: 'apple-1426277135446.png', //=> what i needed to pass as(key)
        acl: 'public-read',
      contentType: 'application/octet-stream',
      contentDisposition: null,
      storageClass: 'STANDARD',
      serverSideEncryption: null,
      metadata: null,
      location: 'https://my-bucket-name.Xx.xu-eXst-3.amazonaws.com/apple-
      1426277135446.png', // => this is what i was passing to deleteObject as "key" 
      etag: '"CXXFE*#&SHFLSKKSXX"',
      versionId: undefined
       }
      

      我的问题是我传递的是图像位置而不是图像名称 在 deleteObject 函数中

      s3.deleteObject({ Bucket: 'bucket-name', Key: 'image.jpg' }, (err, data) 
       // key in the argument has to be the filename with extension without 
      
      // URL like:  https://my-bucket-name.s3.ff-North-1.amazonaws.com/
      
        => {
          console.error(err);
          console.log(data);
      });
      

      所以最终我可以提取带有扩展名的文件(图像)的名称 并传递给上面的函数 这是我从这个答案answer使用的功能@

      function parseUrlFilename(url, defaultFilename = null) {
      // 'https://my-bucket-name.Xx.xu-eXst-3.amazonaws.com/apple-
      1426277135446.png'
      let filename = new URL(url, 
      "https://example.com").href.split("#").shift().split("?").shift().split("/").pop(); //No need to change "https://example.com"; it's only present to allow for processing relative URLs.
      if(!filename) {
          if(defaultFilename) {
              filename = defaultFilename;
          //No default filename provided; use a pseudorandom string.
          } else {
              filename = Math.random().toString(36).substr(2, 10);
          }
      }
          // resulting apple-1426277135446.png'
          return filename;
      }
      

      【讨论】:

        【解决方案3】:

        我遇到了完全相同的问题,并通过给定的代码解决了,

          s3.deleteObjects(
            {
              Bucket: 'uploads-images',
              Delete: {
                Objects: [{ Key: 'product-images/slider-image.jpg' }],
                Quiet: false,
              },
            },
            function (err, data) {
              if (err) console.log('err ==>', err);
              console.log('delete successfully', data);
              return res.status(200).json(data);
            }
          );
        

        这完全适合我。

        【讨论】:

          【解决方案4】:

          从亚马逊服务器上的 url(文件位置)删除文件的示例 此代码允许您从 url 获得 fileKey 在你需要安装 urldecode 之前

          npm i urldecode

          public async deleteFile(location: string) {
              let fileKey = decoder(location)
              const datas = fileKey.split('amazonaws.com/')
              fileKey = datas.pop();
              const params = {
                Bucket: 'Your Bucket',
                Key: fileKey,
              };
              await this.AWS_S3.deleteObject(params).promise();
            }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-29
            • 1970-01-01
            • 2022-07-02
            • 2011-03-09
            • 2012-07-07
            • 2017-11-21
            • 2017-08-01
            • 1970-01-01
            相关资源
            最近更新 更多