Javascript to download a file from amazon s3 bucket?

前端 未结 3 1821
囚心锁ツ
囚心锁ツ 2020-12-01 02:39

I was trying to download a file from a bucket on Amazon S3. I was wondering if I can write a javascript to download such a file from a bucket. I was googling it, but couldn\

相关标签:
3条回答
  • 2020-12-01 03:14

    I came here looking for away to download a s3 file on the client side. Here is how I solved it:

    As, I can not store my s3 auth keys on client side, I used my server-side scripts to generate a pre-signed url and send it back to client like:

    const AWS = require('aws-sdk')
    
    const s3 = new AWS.S3()
    AWS.config.update({accessKeyId: 'your access key', secretAccessKey: 'you secret key'})
    
    const myBucket = 'bucket-name'
    const myKey = 'path/to/your/key/file.extension'
    const signedUrlExpireSeconds = 60 * 5 // your expiry time in seconds.
    
    const url = s3.getSignedUrl('getObject', {
     Bucket: myBucket,
     Key: myKey,
     Expires: signedUrlExpireSeconds
    })
    
    // return the url to client
    

    Use this URL in the front-end to trigger download:

    function download(url){
        $('<iframe>', { id:'idown', src:url }).hide().appendTo('body').click();
    }
    $("#downloadButton").click(function(){
        $.ajax({
            url: 'example.com/your_end_point',
            success: function(url){
                download(url);
            }
        })
    });
    
    0 讨论(0)
  • 2020-12-01 03:25

    Other answers here work, but wanted to expand on what worked for me.

    In my case, I was dealing with files too large for

    function download(url){
        $('<iframe>', { id:'idown', src:url }).hide().appendTo('body').click();
    }
    

    to work. ( Was getting url is too long ) My solution was to include a hidden anchor tag, and trigger the click to that tag on ajax success. You can't use the anchor tag right off the bat unless you don't care about handling errors.

    S3 will respond with an XML error file if something goes wrong, so the browser will automatically display that XML response. By first attempting to hit the URL with ajax, you can catch that error without showing the ugly XML. On success in that ajax call is when you know you're clear to try and download the file.

    0 讨论(0)
  • 2020-12-01 03:36

    Maybe you can use AWS Node.js API:

    var AWS = require('aws-sdk');
    AWS.config.update(
      {
        accessKeyId: ".. your key ..",
        secretAccessKey: ".. your secret key ..",
      }
    );
    var s3 = new AWS.S3();
    s3.getObject(
      { Bucket: "my-bucket", Key: "my-picture.jpg" },
      function (error, data) {
        if (error != null) {
          alert("Failed to retrieve an object: " + error);
        } else {
          alert("Loaded " + data.ContentLength + " bytes");
          // do something with data.Body
        }
      }
    );
    
    0 讨论(0)
提交回复
热议问题