2013-11-26 21 views
15

はい、わかっています。 s3ストレージにはフォルダ概念はありません。私は本当にs3からnode.jsで特定のフォルダを削除したい私は2つの解決策を試しましたが、どちらもうまくいかなかった。 私のコードは以下の通りです。 解決策1: フォルダを直接削除しています。node.jsでs3のフォルダを削除するにはどうしたらいいですか?

var key='level/folder1/folder2/'; 
var strReturn; 
     var params = {Bucket: MyBucket}; 
     var s3 = new AWS.S3(params); 
     s3.client.listObjects({ 
      Bucket: MyBucket, 
      Key: key 
     }, function (err, data) { 
      if(err){ 
       strReturn="{\"status\":\"1\"}"; 

      }else{ 
       strReturn=+"{\"status\":\"0\"}"; 
      } 
      res.send(returnJson); 
      console.log('error:'+err+' data:'+JSON.stringify(data)); 
     }); 

実際、私はfolder2の下にたくさんのファイルを持っています。var key = 'level/folder1/folder2/file1.txt'のようにキーを定義すると、folder2から1つのファイルを削除できますが、フォルダを削除すると機能しませんでした(key = 'level/folder1/folder2/')。 解決方法2: このファイルまたはフォルダをs3にアップロードしたときにオブジェクトに有効期限を設定しようとしました。コードは次のとおりです。

s3.client.putObject({ 
       Bucket: Camera_Bucket, 
       Key: key, 
          ACL:'public-read', 
       Expires: 60 
      } 

しかし、それもありませんでした。アップロードが終了したら、そのファイルのプロパティを確認しました。それは何も値が有効期限にあった示した:

Expiry Date:none 
Expiration Rule:N/A 

どのように私はNode.jsのとS3上のフォルダを削除することができますか?

+0

は、内のすべてのオブジェクトを削除します。 "folder" – datasage

+0

私は 'folder'の中にたくさんのファイルを持っています。私はそのフォルダを削除したかったのです。すべてのファイルをループして削除すると、完了までに時間がかかります。 – user3034559

+1

このフォルダは、その "フォルダ"名を共有するパスのグループとしてのみ存在します。すべてのオブジェクトを削除すると、「フォルダ」は存在しなくなります。たくさんのファイルを削除する場合、これにはしばらく時間がかかることがあります。残りのAPIには一度に1000個までのファイルを削除するコマンドがあり、node.js apiがこれを公開するかどうかはわかりません。 – datasage

答えて

30

aws-sdkモジュールを使用してフォルダを削除できます。あなたが空のときにフォルダを削除することができますので、その中のファイルを削除する必要があります。私はこれのようにやっています。ここで

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(); 
    }); 
    }); 
} 
+4

オブジェクトは1000個に制限されています。オブジェクトが1000を超える場合にはロジックを追加する必要があります。 –

+2

's3.deleteObjects'が返すデータに' data.Contents'パラメータはありません。私はそれを 'data.Deleted'に変更すべきだと思います。 –

+2

「data.Contents」は未定義です。 'data.Deleted'でなければなりません。 – Justin

0

async機能付きES7で実装され、(改訂一覧はAPIオブジェクト)listObjectsV2を使用して:

async function emptyS3Directory(bucket, dir) { 
    const listParams = { 
     Bucket: bucket, 
     Prefix: dir 
    }; 

    const listedObjects = await s3.listObjectsV2(listParams).promise(); 

    if (listedObjects.Contents.length === 0) return; 

    const deleteParams = { 
     Bucket: bucket, 
     Delete: { Objects: [] } 
    }; 

    listedObjects.Contents.forEach(({ Key }) => { 
     deleteParams.Delete.Objects.push({ Key }); 
    }); 

    await s3.deleteObjects(deleteParams).promise(); 

    if (listedObjects.Contents.IsTruncated) await emptyS3Directory(bucket, dir); 
} 

それを呼び出すには:

await emptyS3Directory(process.env.S3_BUCKET, 'images/') 
関連する問題