Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download AWS S3 file directly to a directory

I want to automatically save the file im downloading from AWS S3 to my application folder. Right now this can be done manually. Code below:

    router.get("/download", (req, res) => {
    //File S3 URL
    var fileKey =
        "key";

    AWS.config.update({
        accessKeyId: IAM_USER_KEY,
        secretAccessKey: IAM_USER_SECRET,
        Bucket: BUCKET_NAME
    });

    var s3 = new AWS.S3();
    var file = fs.createWriteStream("test.csv");

    var options = {
        Bucket: "name",
        Key: fileKey
    };

    res.attachment(fileKey);

    var fileStream = s3
        .getObject(options)
        .createReadStream()
        .on("error", error => {
        console.log(error);
        res.json({ error: "An error has occured, check console." });
        })
        .on("httpData", function(data) {

        file.write(data);
        })
        .on("httpDone", function() {
        file.end();
        });

    fileStream.pipe(res);
    //   fse.writeFileSync("text.csv");
    });

As mentioned before, the file can be download and saved manually. But how can write the file and save it automatically in an specific folder?

Thank you

like image 644
Blinhawk Avatar asked Dec 07 '22 14:12

Blinhawk


2 Answers

Here's an example of downloading an S3 object to a specific local file:

const AWS = require('aws-sdk');
var s3 = new AWS.S3({apiVersion: '2006-03-01'});
var params = {Bucket: 'mybucket', Key: 'test.csv'};
var file = require('fs').createWriteStream('/tmp/test.csv');
s3.getObject(params).createReadStream().pipe(file);
like image 172
jarmod Avatar answered Dec 10 '22 02:12

jarmod


The code for jarmod's answer, promisified:

const AWS = require('aws-sdk');
const s3 = new AWS.S3({apiVersion: '2006-03-01'});
const params = {Bucket: 'mybucket', Key: 'test.csv'};
const file = require('fs').createWriteStream('/tmp/test.csv');

new Promise((resolve, reject) => {
  const pipe = s3.getObject(params).createReadStream().pipe(file);
  pipe.on('error', reject);
  pipe.on('close', resolve);
});
like image 39
Richard Nienaber Avatar answered Dec 10 '22 02:12

Richard Nienaber