Node.jsを使用してaws-sdkを使用しています。指定したフォルダー内の画像を一覧表示したい.
この場所にあるすべてのファイルとフォルダーをリストしますが、フォルダー(イメージ)コンテンツはリストしません。 aws-sdkには オブジェクト関数のリスト がありますが、ネストされたファイルもすべてリストしています。
コードは次のとおりです。
var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: 'mykey', secretAccessKey: 'mysecret', region: 'myregion'});
var s3 = new AWS.S3();
var params = {
Bucket: 'mystore.in',
Delimiter: '',
Prefix: 's/5469b2f5b4292d22522e84e0/ms.files'
}
s3.listObjects(params, function (err, data) {
if(err)throw err;
console.log(data);
});
フォルダーは幻想ですが、S3 doesはフォルダーの存在をエミュレートするメカニズムを提供します。
Delimiter
を/
に設定すると、応答の各層は、「フォルダー」の次の層のCommonPrefixes
配列も返します。この配列は、これからプレフィックスに追加します次の層を取得するためのリクエスト。
Prefix
が「フォルダー」の場合、末尾にスラッシュを追加します。それ以外の場合、最初のリクエストは1つの共通プレフィックスを返すため、不要なリクエストを作成します。たとえば、フォルダ "foo"は、1つの一般的なプレフィックス "foo /"を返します。
このコードを使用して、現在正常に動作しています:
var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: 'mykey', secretAccessKey: 'mysecret', region: 'myregion'});
var s3 = new AWS.S3();
var params = {
Bucket: 'mystore.in',
Delimiter: '/',
Prefix: 's/5469b2f5b4292d22522e84e0/ms.files/'
}
s3.listObjects(params, function (err, data) {
if(err)throw err;
console.log(data);
});
私は少し module を付けました。これはあなたが与えた "フォルダ"の内容をリストしています:
s3ls({bucket: 'my-bucket-name'}).ls('/', console.log);
このようなものを印刷します:
{ files: [ 'funny-cat-gifs-001.gif' ],
folders: [ 'folder/', 'folder2/' ] }
そしてそれ
s3ls({bucket: 'my-bucket-name'}).ls('/folder', console.log);
印刷します
{ files: [ 'folder/cv.docx' ],
folders: [ 'folder/sub-folder/' ] }
そして、これはs3ls.js
:
var _ = require('lodash');
var S3 = require('aws-sdk').S3;
module.exports = function (options) {
var bucket = options.bucket;
var s3 = new S3({apiVersion: '2006-03-01'});
return {
ls: function ls(path, callback) {
var prefix = _.trimStart(_.trimEnd(path, '/') + '/', '/');
var result = { files: [], folders: [] };
function s3ListCallback(error, data) {
if (error) return callback(error);
result.files = result.files.concat(_.map(data.Contents, 'Key'));
result.folders = result.folders.concat(_.map(data.CommonPrefixes, 'Prefix'));
if (data.IsTruncated) {
s3.listObjectsV2({
Bucket: bucket,
MaxKeys: 2147483647, // Maximum allowed by S3 API
Delimiter: '/',
Prefix: prefix,
ContinuationToken: data.NextContinuationToken
}, s3ListCallback)
} else {
callback(null, result);
}
}
s3.listObjectsV2({
Bucket: bucket,
MaxKeys: 2147483647, // Maximum allowed by S3 API
Delimiter: '/',
Prefix: prefix,
StartAfter: prefix // removes the folder name from the file listing
}, s3ListCallback)
}
};
};
S3 APIパラメーターでPrefix
を使用できます。私はプロジェクトで使用した例を追加しています:
listBucketContent: ({ Bucket, Folder }) => new Promise((resolve, reject) => {
const params = { Bucket, Prefix: `${Folder}/` };
s3.listObjects(params, (err, objects) => {
if (err) {
reject(ERROR({ message: 'Error finding the bucket content', error: err }));
} else {
resolve(SUCCESS_DATA(objects));
}
});
})
ここで、Bucket
はフォルダーを含むバケットの名前であり、Folder
はファイルをリストするフォルダーの名前です。
コメントで述べたように、S3はフォルダーについて「認識」せず、キーのみを認識します。キーに/を使用して、フォルダー構造を模倣できます。詳細については、こちらを参照してください- http://docs.aws.Amazon.com/AmazonS3/latest/UG/FolderOperations.html
ただし、コードを次のように変更できます。
s3.listObjects(params, function (err, data) {
if(err) throw
//data.contents is an array of objects according to the s3 docs
//iterate over it and see if the key contains a / - if not, it's a file (not a folder)
var itemsThatAreNotFolders = data.contents.map(function(content){
if(content.key.indexOf('/')<0) //if / is not in the key
return content;
});
console.log(itemsThatAreNotFolders);
});
これにより、各キーが/を含むかどうかが確認されます
または、 minio-js クライアントライブラリ、そのオープンソース、AWS S3 APIとの互換性を使用できます。
単にlist-objects.js
の例を使用できます。追加のドキュメントは https://docs.minio.io/docs/javascript-client-api-reference で入手できます。
var Minio = require( 'minio') var s3Client = new Minio({ endPoint: 's3.amazonaws.com'、 accessKey: 'YOUR-ACCESSKEYID'、 secretKey: 'YOUR-SECRETACCESSKEY' }) //バケットmy-bucketnameのすべてのオブジェクトパスをリストします。 var objectsStream = s3Client.listObjects( 'my-bucketname'、 ''、true) objectsStream.on( 'data'、function(obj){ console.log(obj) }) objectsStream.on( 'error'、function(e){ console.log(e) })
それが役に立てば幸い。
免責事項: Minio で働いています