ファイルプロパティをリストする
すべてのファイルをダウンロードすることなく、ファイルをリストできます。これは、Amplify Library for Storageのlist APIを使用して実行できます。 または、getProperties APIを使用して、ファイルのプロパティを個別に取得することもできます。
ファイルをリストする
import { list } from 'aws-amplify/storage';
const result = await list({ path: 'album/photos/', // または、path: ({identityId}) => `album/${identityId}/photos/`});末尾のスラッシュ/に注意してください。list({ path: 'album/photos' })をリクエストした場合、album/photos123.jpgと同様にalbum/photos/123.jpgにもマッチします。
レスポンスの形式は、以下の例のようになります:
{ items: [ { path: "album/photos/123.jpg", eTag: "30074401292215403a42b0739f3b5262", lastModified: "Thu Oct 08 2020 23:59:31 GMT+0800 (Singapore Standard Time)", size: 138256 }, // ... ],}pageSizeが全ファイルサイズより低く設定されている場合、単一のlist呼び出しはすべてのファイルのサブセットのみを返します。複数の呼び出しですべてのファイルをリストするには、ユーザーはnextTokenフラグを使用できます:
import { list } from 'aws-amplify/storage';
const PAGE_SIZE = 20;let nextToken;// ...const loadNextPage = async () => { const response = await list({ path: 'photos/', // または、path: ({ identityId }) => `album/${identityId}/photos/` options: { pageSize: PAGE_SIZE, nextToken, }, }); if (response.nextToken) { nextToken = response.nextToken; } else { nextToken = undefined; } // response.itemsからリストアイテムをレンダリング};すべてのファイルをリストする
import { list } from 'aws-amplify/storage';
const result = await list({ path: 'album/photos/', // または、path: ({identityId}) => `album/${identityId}/photos/`, options: { listAll: true, }}); 手動で作成されたフォルダはsizeが0のファイルとして表示されますが、file.key.match(/\.[0-9a-z]+$/i)のようなрегexに対してキーをマッチさせることで、ファイルとフォルダを区別することもできます。「フォルダ」はAmazon S3では仮想概念であるため、任意のファイルは名前に/があるだけで任意の深さのフォルダを宣言できます。
「フォルダ」のコンテンツとサブパスにアクセスするには、2つのオプションがあります:
- パス全体をリクエストしてコンテンツを解析する。
- subpathStrategyオプションを使用して、指定されたパス内のファイルのみを取得します(つまり、サブパス下のファイルを除外)。
パス内のすべてのネストされたファイルを取得する
これは、指定されたパス下のすべてのファイルとフォルダを取得します。結果を解析して、指定されたパス内のファイルのみを取得する必要がある場合があります。
function processStorageList(response) { let files = []; let folders = new Set(); response.items.forEach((res) => { if (res.size) { files.push(res); // 時々ファイルは内部に/を持つフォルダを宣言します let possibleFolder = res.path.split('/').slice(0, -1).join('/'); if (possibleFolder) folders.add(possibleFolder); } else { folders.add(res.path); } }); return { files, folders };}ファイルとフォルダをネストされたオブジェクトの観点から必要な場合(例えば、エクスプローラーUIをビルドするため)、再帰的に解析することができます:
function processStorageList(response) { const filesystem = {}; // https://stackoverflow.com/questions/44759750/how-can-i-create-a-nested-object-representation-of-a-folder-structure const add = (source, target, item) => { const elements = source.split('/'); const element = elements.shift(); if (!element) return; // 空白 target[element] = target[element] || { __data: item }; // element; if (elements.length) { target[element] = typeof target[element] === 'object' ? target[element] : {}; add(elements.join('/'), target[element], item); } }; response.items.forEach((item) => add(item.path, filesystem, item)); return filesystem;}これは各アイテムのデータを特別な__dataキーに配置します。
サブパスを除外する
パスのすべてのコンテンツを取得するためにlist APIを使用することに加えて、サブパス下のファイルを除外しながらパス内のファイルのみを取得するために使用することもできます。
例えば、path内の以下のキーが与えられた場合、「vacation」サブパスとそのコンテンツではなく、jpgオブジェクトのみを返したい場合があります:
photos/photo1.jpgphotos/vacation/これはsubpathStrategyオプションで実現できます:
import { list } from "aws-amplify/storage";const result = await list({ path: "photos/", options:{ subpathStrategy: { strategy:'exclude' } }});レスポンスにはphotos/パス内のオブジェクトのみが含まれ、除外されたサブパスも伝えます:
{ excludedSubpaths: [ 'photos/vacation/' ], items: [ { path: "photos/photo1.jpg", eTag: "30074401292215403a42b0739f3b5262", lastModified: "Thu Oct 08 2020 23:59:31 GMT+0800 (Singapore Standard Time)", size: 138256 }, ]}デフォルトの区切り文字は/ですが、カスタム区切り文字を指定して変更できます:
const result = await list({ // パスは`/`ではなく`-`文字を使用してファイルを整理します path: 'photos-', options: { subpathStrategy: { strategy: 'exclude', delimiter: '-' } }});指定されたバケットからファイルをリストする
bucketオプションを指定することで、特定のバケットに対してcopy操作を実行することもできます。このオプションは、Amplify Backendで割り当てられたバケット名を表す文字列、またはコンソールから指定されたバケット名とリージョンを指定するオブジェクトです。
import { list } from 'aws-amplify/storage';
const result = await list({ path: 'photos/', options: { // Amplify Backendで割り当てられた名前を使用してターゲットバケットを指定する bucket: 'assignedNameInAmplifyBackend', // または、コンソールからバケット名と関連するリージョンを指定します // bucket: { // bucketName: 'generated-secondary-bucket-name', // region: 'us-east-2' // } }});その他のlistオプション
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
| bucket | string | { bucketName: string; region: string; } | Amplify設定のデフォルトバケットとリージョン | Amplify Backendで割り当てられたターゲットバケット名を表す文字列、またはコンソールから指定されたバケット名とリージョンを指定するオブジェクト。 追加のストレージバケットを構成するで詳細を確認できます |
| listAll | boolean | false | 指定されたpath内のすべてのファイルをリストするにはtrueに設定します |
| pageSize | number | 1000 | 返すファイルの最大数を設定します。範囲は0~1000です |
| nextToken | string | — | このバケットでリストが続いているかどうかを示すトークン |
| subpathStrategy | { strategy: 'include' } | { 'exclude', delimiter?: string } | { strategy: 'include' } | サブパス包含戦略と除外結果をグループ化するために使用される区切り文字を表すオブジェクト。 サブパスを除外するで詳細を確認できます |
| useAccelerateEndpoint | boolean | false | 高速化エンドポイントを使用するかどうか。 転送の高速化で詳細を確認できます |
| expectedBucketOwner | string | オプション | リクエストされたバケットを所有するアカウントID。 |
ファイルプロパティを取得する
個別のファイルのプロパティを表示することもできます。
import { getProperties } from 'aws-amplify/storage';
try { const result = await getProperties({ path: 'album/2024/1.jpg', // または、path: ({ identityId }) => `album/${identityId}/1.jpg` options: { // Amplify Backendで割り当てられた名前を使用してターゲットバケットを指定する bucket: 'assignedNameInAmplifyBackend' } }); console.log('File Properties ', result);} catch (error) { console.log('Error ', error);}プロパティとメタデータは以下の例に似ています
{ path: "album/2024/1.jpg", contentType: "image/jpeg", contentLength: 6873, eTag: "\"56b32cf4779ff6ca3ba3f2d455fa56a7\"", lastModified: Wed Apr 19 2023 14:20:55 GMT-0700 (Pacific Daylight Time) {}, metadata: { owner: 'aws' }}その他のgetPropertiesオプション
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
| bucket | string | { bucketName: string; region: string; } | Amplify設定のデフォルトバケットとリージョン | Amplify Backendで割り当てられたターゲットバケット名を表す文字列、またはコンソールから指定されたバケット名とリージョンを指定するオブジェクト。 追加のストレージバケットを構成するで詳細を確認できます |
| useAccelerateEndpoint | boolean | false | 高速化エンドポイントを使用するかどうか。 |