[Node.js] 串接 Amazon S3 API

Posted by Huli on 2015-07-13

最近剛好要串S3,S3是Amazon提供的一個服務,就是一個讓你存取檔案的地方
官方新手教學其實寫得很清楚,而且用法超級簡單
Document裡面有詳細的說明

下面附上一段上傳檔案的code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var AWS = require('aws-sdk');
function upload(data) {
AWS.config.update({
accessKeyId: awsConfig.key,
secretAccessKey: awsConfig.secret
});
var s3 = new AWS.S3({
params: {
Bucket: awsConfig.s3.bucket,
Key: 'image/test.png', //檔案名稱
ACL: 'public-read' //檔案權限
}
});
s3.upload({
Body: data
}).on('httpUploadProgress', function(evt) {
//上傳進度
console.log(evt);
}).
send(function(err, data) {
//上傳完畢或是碰到錯誤
});
}

官方教學是要你把key設定在電腦的某個位置,但如果懶得這樣做也可以自己寫個config檔之類的
再去update即可

值得一提的是Key這邊你可以直接傳有層次的路徑,AWS會自動幫你建立資料夾,超方便
要刪除檔案也是很簡單,就給個Key參數然後call deleteObject

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function deleteObject(key){
var s3 = new AWS.S3({
params:{
Bucket: awsConfig.s3.bucket
}
});
var params = {
Bucket: awsConfig.s3.bucket,
Key: key
};
//刪除檔案囉
s3.deleteObject(params, function(err, data) {
if(err){
console.log(err);
}
console.log('delete '+ key +' done.');
});
}

那如果想刪除一個資料夾怎麼辦呢?
可參考stackoverflow的這篇 How can I delete folder on s3 with node.js?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var params = {
Bucket: 'bucketName',
Prefix: 'folder/'
};
s3.listObjects(params, function(err, data) {
if (err) return console.log(err);
params = {Bucket: 'bucketName'};
params.Delete = {};
params.Delete.Objects = [];
data.Contents.forEach(function(content) {
params.Delete.Objects.push({Key: content.Key});
});
s3.deleteObjects(params, function(err, data) {
if (err) return console.log(err);
return console.log(data.Deleted.length);
});
});

就是先用listObjects找出key的prefix是某個資料夾的物件,接著再把裡面的key放進陣列
deleteObjects這個api把那些objects全部移除掉
不過這邊有個小限制,listObjects的上限是一千個,所以如果檔案超過1000個就會刪不乾淨
但是一般的使用應該比較沒這種困擾,碰到的時候再加個判斷即可

結論:AWS真方便