Node.js AWS S3 파일 처리 연동 팁

2017. 6. 20. 15:12서버 프로그래밍

Nodejs를 위한 S3 SDK

https://opentutorials.org/module/1946/11797


이미지 업로드 예제

var AWS = require('aws-sdk');
var fs = require('fs');
AWS.config.region = 'ap-northeast-2';
var s3 = new AWS.S3();
var param = {
'Bucket':'codingeverybody2',
'Key':'logo.png',
'ACL':'public-read',
'Body':fs.createReadStream('94.png'),
'ContentType':'image/png'
}
s3.upload(param, function(err, data){
console.log(err);
console.log(data);
})


이미지 목록 조회 예제

var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-2';
var s3 = new AWS.S3();
s3.listObjects({Bucket: 'codingeverybody2'}).on('success', function handlePage(response) {
for(var name in response.data.Contents){
console.log(response.data.Contents[name].Key);
}
if (response.hasNextPage()) {
response.nextPage().on('success', handlePage).send();
}
}).send();


listObjects 메소드는 1000개까지만 리턴하므로, 1000개 이상의 파일을 조회하려면 다음과 같이 recursive하게 구현해야 한다.

https://stackoverflow.com/questions/9437581/node-js-amazon-s3-how-to-iterate-through-all-files-in-a-bucket

var allKeys = [];
function listAllKeys(marker, cb)
{
  s3.listObjects({Bucket: s3bucket, Marker: marker}, function(err, data){
    allKeys.push(data.Contents);

    if(data.IsTruncated)
      listAllKeys(data.NextMarker, cb);
    else
      cb();
  });
}


파일 삭제 예제

https://stackoverflow.com/questions/20207063/how-can-i-delete-folder-on-s3-with-node-js

function emptyBucket(bucketName,callback){
  var params = {
    Bucket: bucketName,
    Prefix: 'folder/'
  };

  s3.listObjects(params, function(err, data) {
    if (err) return callback(err);

    if (data.Contents.length == 0) callback();

    params = {Bucket: bucketName};
    params.Delete = {Objects:[]};

    data.Contents.forEach(function(content) {
      params.Delete.Objects.push({Key: content.Key});
    });

    s3.deleteObjects(params, function(err, data) {
      if (err) return callback(err);
      if(data.Contents.length == 1000)emptyBucket(bucketName,callback);
      else callback();
    });
  });
}