Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8922

node.jsからAmazonS3へファイルアップロード

$
0
0

確認した環境

node.js: 10.17.0
s3-client: 4.4.2

s3-clientのインストール

s3-clientをインストールします。

npm i s3-client

s3クライアントのインスタンスを作成

imports3from"s3-client";constclient=s3.createClient({s3Options:{accessKeyId:ここにS3のアクセスキーID,secretAccessKey:ここにs3のシークレットキー,}})

s3へアップロード

s3-clientのreadmeによるアップロードのサンプルは以下です。

varparams={localFile:"some/local/file",s3Params:{Bucket:"s3 bucket name",Key:"some/remote/file",// other options supported by putObject, except Body and ContentLength.// See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property},};varuploader=client.uploadFile(params);uploader.on('error',function(err){console.error("unable to upload:",err.stack);});uploader.on('progress',function(){console.log("progress",uploader.progressMd5Amount,uploader.progressAmount,uploader.progressTotal);});uploader.on('end',function(){console.log("done uploading");});

サンプルのままだと使いづらいんで、Promiseオブジェクトでラップし、async/awaitが使えるようにします。

constuploadFileToS3=(bucketName,remoteDir,localFilePath)=>{returnnewPromise(async(resolve,reject)=>{constfileName=localFilePath.split('/').pop()constparams={localFile:localFilePath,s3Params:{Bucket:bucketName,Key:remoteDir+'/'+fileName// S3はオブジェクトストレージなのでフォルダの概念はないが、オブジェクトキーにスラッシュ区切りのパス名をつけることで、それをフォルダと解釈する},};constuploader=awaitclient.uploadFile(params);uploader.on('error',(err)=>{reject(err.stack)});uploader.on('end',function(){resolve()});});}

これで、async/awaitを使えるようになりました。

(async()=>{awaituploadFileToS3(s3backet,s3のフォルダ名,ローカルのファイルパス)})();

フォルダをまるごとアップロードしたい場合は、以下を使用します。

constuploadS3Dir=async(bucketName,localDir,remoteDir=null)=>{returnnewPromise(async(resolve,reject)=>{varparams={localDir,deleteRemoved:false,// default false, whether to remove s3 objects// that have no corresponding local file.s3Params:{Bucket:bucketName,Prefix:remoteDir,// See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property},};varuploader=client.uploadDir(params);uploader.on('error',err=>{reject(err.stack)});uploader.on('end',()=>{resolve()});});}

s3のファイルリスト取得

S3バケット名を指定し、そこにある全てのファイルリストを再帰的に取得します。

constlistS3Objects=async(bucketName,remoteDir=null)=>{returnnewPromise(async(resolve,reject)=>{varparams={recursive:true,// これをfalseにすると1階層のみの取得となるs3Params:{Bucket:bucketName,Prefix:remoteDir,// See: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjects-property},};constfinder=client.listObjects(params);letobjects=[]finder.on('data',function(data){objects=data});finder.on('error',err=>{reject(err.stack)});finder.on('end',()=>{resolve(objects)});});}

s3にあるファイルの削除

S3バケット名と、オブジェクトキー文字列の配列を指定し、ファイルを削除します。

// objectKeys: [ remoteFile1, remoteFile2, ...]constdeleteS3Objects=async(bucketName,objectKeys)=>{returnnewPromise(async(resolve,reject)=>{varparams={Bucket:bucketName,Delete:{Objects:objectKeys.map(k=>({Key:k}))}};constdeleter=client.deleteObjects(params);deleter.on('error',err=>{reject(err.stack)});deleter.on('end',()=>{resolve()});});}

サンプル

S3のバケットをいったん空にしてファイルをアップロードするサンプルです。

// ここに上記の各関数を記述(async()=>{constconfigs={acckey:S3のアクセスキーID,seckey:S3のシークレットキー,bucket:S3のバケット名,}constclient=s3.createClient({s3Options:{accessKeyId:configs.acckey,secretAccessKey:configs.seckey,}})// 既存のobjectを削除constlist=awaitlistS3Objects(configs.bucket)constkeys=list.Contents.map(i=>i.Key)//console.log(keys)if(keys.length>0)awaitdeleteS3Objects(configs.bucket,keys)awaituploadFileToS3(configs.bucket,'foo','./bar.txt')// このプログラムの実行フォルダ直下に、`bar.txt`ファイルが存在する前提})();

Viewing all articles
Browse latest Browse all 8922

Trending Articles