首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在以下情况下如何删除亚马逊s3上的文件镜像

在以下情况下如何删除亚马逊s3上的文件镜像
EN

Stack Overflow用户
提问于 2020-12-03 19:09:29
回答 4查看 1.4K关注 0票数 5

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

我现在面临的挑战是,当我删除程序时,我的本地机器上的所有东西都被删除了,但我意识到文件(图像)仍然存在于我的Aws s3控制台上。如何删除我的数据库和亚马逊s3上的文件?

Here are my Program routes

这就是我如何删除我的程序

代码语言:javascript
复制
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");
  });
});

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

代码语言:javascript
复制
  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");
 }
});
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-12-03 19:49:36

翻看Multer-s3存储库,我找不到任何提到从s3中删除的内容。源代码中有this function,但我不知道如何使用它。

您可以尝试通过deleteObject直接使用AWS SDK

代码语言:javascript
复制
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);
});
票数 3
EN

Stack Overflow用户

发布于 2021-07-23 23:25:31

我有完全相同的问题,并通过给定的代码修复,

代码语言:javascript
复制
  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);
    }
  );

这对我来说很有效。

票数 1
EN

Stack Overflow用户

发布于 2021-07-15 00:21:49

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

代码语言:javascript
复制
{
  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函数中传递的是图像位置,而不是图像名称

代码语言:javascript
复制
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中使用的函数

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65124827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档