【问题标题】:How do I delete an object on AWS S3 using Javascript?如何使用 Javascript 删除 AWS S3 上的对象?
【发布时间】:2015-03-01 10:46:44
【问题描述】:

我想使用 Javascript 从 Amazon S3 中删除一个文件。我已经使用 Javascript 上传了文件。有什么想法吗?

【问题讨论】:

    标签: javascript amazon-web-services amazon-s3 aws-sdk amazon


    【解决方案1】:

    您可以使用JS method from S3:

    var AWS = require('aws-sdk');
    
    AWS.config.loadFromPath('./credentials-ehl.json');
    
    var s3 = new AWS.S3();
    var params = {  Bucket: 'your bucket', Key: 'your object' };
    
    s3.deleteObject(params, function(err, data) {
      if (err) console.log(err, err.stack);  // error
      else     console.log();                 // deleted
    });
    

    请注意,如果对象已被删除,S3 永远不会返回该对象。 您必须在 getobject、headobject、waitfor 等之前或之后检查它

    【讨论】:

    • S3 返回 DeleteMarker 和 VersionId。
    • @Rohit 那是因为你有一个版本化的存储桶。您需要删除所有对象版本(包括任何删除标记)才能完全删除对象。
    • 如果使用async/await,最后必须加上.promise()。例如:await s3.deleteObject(params).promise()
    • @AJB 有没有办法一次删除文件的所有版本?还是应该逐版执行?
    • @shwz 没有办法同时删除所有版本(和 deleteMarkers)。我相信这是设计使不可能意外删除对象。您需要首先收集所有 versionID 和 deleteMarkers,然后使用批处理或循环对所有这些调用 deleteObject。
    【解决方案2】:

    你可以像这样使用构造:

    var params = {
      Bucket: 'yourBucketName',
      Key: 'fileName'
      /* 
         where value for 'Key' equals 'pathName1/pathName2/.../pathNameN/fileName.ext'
         - full path name to your file without '/' at the beginning
      */
    };
    
    s3.deleteObject(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });
    

    并且不要忘记将它包装到 Promise

    【讨论】:

    • 这会删除一个文件...我用过它,它的功能
    • 即使对象不存在,响应也是一样的
    • 我知道我已经很晚了,但这解决了我的问题......我不知道为什么。使用以下语法删除对我有用:“const deleteRes = await s3.deleteObject({Bucket: 'some-bucket', Key: req.query.someKey});”在我开始将我的对象组织到文件夹中之前,当它停止工作时。切换到:“s3.deleteObject({Bucket: 'some-bucket', Key: req.query.someKey}, function(err, data){});”解决了这个错误,但我不知道为什么。有什么想法吗?
    【解决方案3】:

    在删除文件之前,您必须检查 1) 文件是否在存储桶中,因为如果该文件在存储桶中不可用并且使用 deleteObject API 这不会引发任何错误 2)CORS Configuration桶。通过使用headObject API 给出存储桶中的文件状态。

    AWS.config.update({
            accessKeyId: "*****",
            secretAccessKey: "****",
            region: region,
            version: "****"
        });
    const s3 = new AWS.S3();
    
    const params = {
            Bucket: s3BucketName,
            Key: "filename" //if any sub folder-> path/of/the/folder.ext
    }
    try {
        await s3.headObject(params).promise()
        console.log("File Found in S3")
        try {
            await s3.deleteObject(params).promise()
            console.log("file deleted Successfully")
        }
        catch (err) {
             console.log("ERROR in file Deleting : " + JSON.stringify(err))
        }
    } catch (err) {
            console.log("File not Found ERROR : " + err.code)
    }
    

    由于参数是恒定的,因此最好将其与const 一起使用。如果在 s3 中找不到该文件,则会引发错误 NotFound : null

    如果您想在存储桶中应用任何操作,您必须在 AWS 中更改相应存储桶中CORS Configuration 的权限。用于更改权限Bucket->permission->CORS Configuration 并添加此代码。

    <CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    </CORSConfiguration>
    

    有关 CROS 配置的更多信息:https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html

    【讨论】:

    • 这是更好的答案,因为它说明了文件是否存在。
    【解决方案4】:

    您可以使用deleteObjects API 一次删除多个对象,而不是为每个要删除的键调用 API。有助于节省时间和网络带宽。

    您可以执行以下操作-

    var deleteParam = {
        Bucket: 'bucket-name',
        Delete: {
            Objects: [
                {Key: 'a.txt'},
                {Key: 'b.txt'},
                {Key: 'c.txt'}
            ]
        }
    };    
    s3.deleteObjects(deleteParam, function(err, data) {
        if (err) console.log(err, err.stack);
        else console.log('delete', data);
    });
    

    参考见 - https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#deleteObjects-property

    【讨论】:

      【解决方案5】:

      你可以关注这个 GitHub gist 链接https://gist.github.com/jeonghwan-kim/9597478

      删除-aws-s3.js:

      var aws = require('aws-sdk');
      var BUCKET = 'node-sdk-sample-7271';
      aws.config.loadFromPath(require('path').join(__dirname, './aws-config.json'));
      var s3 = new aws.S3();
      
      var params = {
        Bucket: 'node-sdk-sample-7271', 
        Delete: { // required
          Objects: [ // required
            {
              Key: 'foo.jpg' // required
            },
            {
              Key: 'sample-image--10.jpg'
            }
          ],
        },
      };
      
      s3.deleteObjects(params, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data);           // successful response
      });
      

      【讨论】:

        【解决方案6】:

        非常直接

        首先,创建一个 s3 的实例并使用凭据对其进行配置

        const S3 = require('aws-sdk').S3;
        
        const s3 = new S3({
            accessKeyId: process.env.AWS_ACCESS_KEY_ID,
            secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
            region: process.env.AWS_REGION
        });
        

        之后,follow the docs

        
         var params = {
          Bucket: "ExampleBucket", 
          Key: "HappyFace.jpg"
         };
         s3.deleteObject(params, function(err, data) {
           if (err) console.log(err, err.stack); // an error occurred
           else     console.log(data);           // successful response
           /*
           data = {
           }
           */
         });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-27
          • 1970-01-01
          • 1970-01-01
          • 2018-12-25
          • 1970-01-01
          • 2021-08-22
          • 1970-01-01
          • 2015-04-09
          相关资源
          最近更新 更多