How do I delete an object on AWS S3 using Javascript?

73,713

Solution 1

You can use the 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
});

Be aware that S3 never returns the object if it has been deleted. You have to check it before or after with getobject, headobject, waitfor, etc

Solution 2

You can use construction like this:

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
});

And don't forget to wrap it to the Promise.

Solution 3

Before deleting the file you have to check the 1) file whether it is in the bucket because If the file is not available in the bucket and using deleteObject API this doesn't throw any error 2)CORS Configuration of the bucket. By using headObject API gives the file status in the bucket.

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)
}

As params are constant, the best way to use it with const. If the file is not found in the s3 it throws the error NotFound : null.

If you want to apply any operations in the bucket, you have to change the permissions of CORS Configuration in the respective bucket in the AWS. For changing permissions Bucket->permission->CORS Configuration and Add this code.

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

for more information about CROS Configuration : https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html

Solution 4

You can use deleteObjects API to delete multiple objects at once instead of calling API for each key to delete. Helps save time and network bandwidth.

You can do following-

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);
});

For reference see - https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#deleteObjects-property

Solution 5

You can follow this GitHub gist link https://gist.github.com/jeonghwan-kim/9597478.

delete-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
});
Share:
73,713
user3335960
Author by

user3335960

Updated on February 16, 2022

Comments

  • user3335960
    user3335960 over 2 years

    I want to delete a file from Amazon S3 using Javascript. I have already uploaded the file using Javascript. Any ideas?

  • Rohit
    Rohit almost 9 years
    S3 returns DeleteMarker and VersionId.
  • AJB
    AJB over 7 years
    @Rohit that's because you've got a versioned bucket. You need to delete all object versions (including any delete markers) in order to remove the object entirely.
  • Thai Ha
    Thai Ha about 5 years
    If using async/await, you must add .promise() at last. Ex: await s3.deleteObject(params).promise()
  • shwz
    shwz about 5 years
    @AJB Is there any way to delete all versions of a file at once? or it should be carried out version by version?
  • AJB
    AJB about 5 years
    @shwz There's no method to delete all versions (and deleteMarkers) at the same time. I believe that is by design to make it impossible to accidentally delete objects. You need to first gather all the versionIDs and deleteMarkers and then call deleteObject on all of them using either a batch or a loop.
  • shwz
    shwz about 5 years
    @AJB Yes, thanks for the reply. I gethered all the versions and passed to deleteObjects method
  • Steve Nginyo
    Steve Nginyo almost 4 years
    this deletes a single file... I've used it and it's functional
  • Steve Nginyo
    Steve Nginyo almost 4 years
    the response is the same though even when the object does not exist
  • Rharris389
    Rharris389 almost 3 years
    I know I'm super late to this, but this solved my problem... and I'm not sure why. Deleting was working for me using the following syntax: "const deleteRes = await s3.deleteObject({Bucket: 'some-bucket', Key: req.query.someKey});" before I started organizing my objects into folders when this stopped working. Switching to: "s3.deleteObject({Bucket: 'some-bucket', Key: req.query.someKey}, function(err, data){});" solved this error but I have no idea why. Any thoughts?
  • wael32gh
    wael32gh over 2 years
    This's better answer, because it accounts for file existing or not.