ファイルのアップロード
アプリにアップロード機能を実装するには、File Uploader UIコンポーネントを使用するか、アップロードAPIを使用してアップロードエクスペリエンスをさらにカスタマイズする方法があります。
File Uploader React UIコンポーネント
クラウド接続型のFile Uploader UIコンポーネントを使用して、数分でアプリからファイルをアップロードできます。
npm add @aws-amplify/ui-react-storage aws-amplify次に、アプリ内でコンポーネントを使用します。
import { FileUploader } from '@aws-amplify/ui-react-storage';import '@aws-amplify/ui-react/styles.css';
export const DefaultFileUploaderExample = () => { return ( <FileUploader acceptedFileTypes={['image/*']} path="public/" maxFileCount={1} isResumable /> );};UIコンポーネントのカスタマイズについて詳しくは、File Uploaderのドキュメントをご参照ください。
アップロード機能の実装
ファイルからのアップロード
以下は、ファイルオブジェクトからファイルをアップロードする方法の例です。ファイルオブジェクトはローカルマシンや別のソースから取得できます。
import { uploadData } from "aws-amplify/storage";
const file = document.getElementById("file");const upload = document.getElementById("upload");
upload.addEventListener("click", () => { const fileReader = new FileReader(); fileReader.readAsArrayBuffer(file.files[0]);
fileReader.onload = async (event) => { console.log("Complete File read successfully!", event.target.result); try { await uploadData({ data: event.target.result, path: file.files[0].name }); } catch (e) { console.log("error", e); } };});データからのアップロード
メモリに保存されたデータをクラウドにアップロードしたい場合は、この例に従ってください。
import { uploadData } from 'aws-amplify/storage';
try { const result = await uploadData({ path: "album/2024/1.jpg", // Alternatively, path: ({identityId}) => `album/${identityId}/1.jpg` data: file, }).result; console.log('Succeeded: ', result);} catch (error) { console.log('Error : ', error);}指定したバケットへのアップロード
bucketオプションを指定することで、特定のバケットへのアップロード操作を実行することもできます。Amplify Backendでのターゲットバケットの割り当て名を表す文字列を渡すことができます。
import { uploadData } from 'aws-amplify/storage';
const result = await uploadData({ path: 'album/2024/1.jpg', data: file, options: { // Amplify Backendで割り当てられた名前を使ってターゲットバケットを指定する bucket: 'assignedNameInAmplifyBackend' }}).result;あるいは、コンソールからバケット名とリージョンを指定してオブジェクトを渡すこともできます。
import { uploadData } from 'aws-amplify/storage';
const result = await uploadData({ path: 'album/2024/1.jpg', data: file, options: { // あるいは、コンソールからバケット名と関連するリージョンを指定する bucket: { bucketName: 'bucket-name-from-console', region: 'us-east-2' } }}).result;アップロードの進捗を監視する
onProgressオプションを使用してアップロードの進捗を監視します。
import { uploadData } from 'aws-amplify/storage';
const monitorUpload = async () => { try { const result = await uploadData({ path: "album/2024/1.jpg", // Alternatively, path: ({identityId}) => `album/${identityId}/1.jpg` data: file, options: { onProgress: ({ transferredBytes, totalBytes }) => { if (totalBytes) { console.log( `Upload progress ${Math.round( (transferredBytes / totalBytes) * 100 )} %` ); } }, }, }).result; console.log("Path from Response: ", result.path); } catch (error) { console.log("Error : ", error); }}アップロードの一時停止、再開、キャンセル
uploadDataリクエストの再開、一時停止、キャンセルをサポートするコールバック関数があります。
import { uploadData, isCancelError } from 'aws-amplify/storage';
// タスクの一時停止、再開、キャンセルconst uploadTask = uploadData({ path, data: file });//...uploadTask.pause();//...uploadTask.resume();//...uploadTask.cancel();//...try { await uploadTask.result;} catch (error) { if (isCancelError(error)) { // タスクのキャンセルによってスローされたエラーを処理する }}オブジェクトメタデータ付きの転送
metadataオプションを渡すことで、カスタムメタデータをアップロードされたオブジェクトに関連付けることができます。
import { uploadData } from 'aws-amplify/storage';
const result = await uploadData({ path: 'album/2024/1.jpg', data: file, options: { metadata: { customKey: 'customValue', }, },});その他のアップロードオプション
uploadDataの動作とアップロードされたオブジェクトのプロパティは、追加のオプションを渡すことでカスタマイズできます。
import { uploadData } from 'aws-amplify/storage';
const result = await uploadData({ path: 'album/2024/1.jpg', data: file, options: { // ダウンロード時に使用するcontent-typeヘッダー contentType: "image/jpeg", // オブジェクトの表示方法を設定する contentDisposition: "attachment", // アクセラレートエンドポイントを使用するかどうか useAccelerateEndpoint: true, // リクエストされたバケットを所有するアカウントID expectedBucketOwner: "123456789012", // アップロード完了前に同じキーを持つオブジェクトがすでに存在するかチェックするかどうか preventOverwrite: true, // S3がデータの整合性を検証できるよう、アップロードするデータのチェックサムを計算するかどうか checksumAlgorithm: "crc-32", // 現在は'crc-32'のみサポート },});| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
| bucket | string | { bucketName: string; region: string; } | Amplify設定のデフォルトバケットとリージョン | Amplify Backendでの割り当て名を表す文字列、またはコンソールのバケット名とリージョンを指定するオブジェクト。 詳細は追加のストレージバケットの設定をご覧ください。 |
| contentType | string | application/octet-stream | ファイルをダウンロードする際のデフォルトcontent-typeヘッダー値。 詳細はContent-Typeのドキュメントをご覧ください。 |
| contentEncoding | string | — | ファイルをダウンロードする際のデフォルトcontent-encodingヘッダー値。 詳細はContent-Encodingのドキュメントをご覧ください。 |
| contentDisposition | string | — | オブジェクトの表示情報を指定します。 詳細はContent-Dispositionのドキュメントをご覧ください。 |
| metadata | map<string> | — | S3のオブジェクトと一緒に保存するメタデータのマップ。 詳細はS3メタデータのドキュメントをご覧ください。 |
| useAccelerateEndpoint | boolean | false | アクセラレートエンドポイントを使用するかどうか。 詳細はTransfer Accelerationをご覧ください。 |
| expectedBucketOwner | string | - | リクエストされたバケットを所有するアカウントID。 |
| preventOverwrite | boolean | false | アップロード完了前に同じキーを持つオブジェクトがすでに存在するかチェックするかどうか。存在する場合、Precondition Failedエラーがスローされます。 |
| checksumAlgorithm | "crc-32" | - | S3がデータ整合性を検証できるよう、アップロードするデータのチェックサムを計算するかどうか。現在は'crc-32'のみサポートされています。 |
マルチパートアップロード
Amplifyは5MBを超えるオブジェクトに対して自動的にAmazon S3マルチパートアップロードを実行します。S3のマルチパートアップロードの詳細については、マルチパートアップロードを使用したオブジェクトのアップロードとコピーを参照してください。
署名付きURLを使用したアップロード
method: 'PUT'を指定したgetUrl APIを使用して、S3に直接ファイルをアップロードするための署名付きURLを生成できます。これは以下のような場合に便利です:
- 標準HTTPURLエンドポイントのみを受け付けるサードパーティのツールやライブラリと統合する必要がある場合(例: DuckDB、データベースエクスポートツール)
- Next.js APIルートやその他のSSRフレームワークなど、サーバーサイドの環境からアップロードしたい場合
- 一時的なアップロードリンクを別のクライアントやサービスと共有したい場合
import { getUrl } from 'aws-amplify/storage';
// アップロード用の署名付きURLを生成するconst { url, expiresAt } = await getUrl({ path: 'album/2024/1.jpg', options: { method: 'PUT', expiresIn: 3600, // URLは1時間有効 contentType: 'image/jpeg', }});
console.log('Upload URL: ', url);console.log('URL expires at: ', expiresAt);次に署名付きURLを使用して標準HTTPのPUTリクエストでファイルをアップロードします:
await fetch(url, { method: 'PUT', body: file, headers: { 'Content-Type': 'image/jpeg', },});サードパーティツールでの署名付きURLの使用
署名付きURLは標準HTTPエンドポイントであるため、HTTPアップロードをサポートする任意のツールで使用できます:
import { getUrl } from 'aws-amplify/storage';
const { url } = await getUrl({ path: 'analytics/data.parquet', options: { method: 'PUT', contentType: 'application/octet-stream', }});
// 例: DuckDBを使用してクエリ結果をS3に直接エクスポートするawait duckdb.query(` COPY (SELECT * FROM processed_data) TO '${url}' (FORMAT PARQUET)`);署名付きURLアップロードオプション
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
| method | 'GET' | 'PUT' | 'GET' | 署名付きURLのHTTPメソッド。アップロードURLを生成するには'PUT'を使用します。 |
| bucket | string | { bucketName: string; region: string; } | Amplify設定のデフォルトバケットとリージョン | Amplify Backendでの割り当て名を表す文字列、またはコンソールのバケット名とリージョンを指定するオブジェクト。 詳細は追加のストレージバケットの設定をご覧ください。 |
| expiresIn | number | 900 | URLが期限切れになるまでの秒数。 署名付きURLの有効期限はセッションに依存し、最大1時間となります。 |
| contentType | string | — | アップロードするファイルのMIMEタイプ。指定した場合、アップロードリクエストに一致するContent-Typeヘッダーを含める必要があります。 |
| contentDisposition | string | object | — | オブジェクトの表示情報を指定します。文字列(例: 'attachment; filename="file.jpg"')またはオブジェクト(例: { type: 'attachment', filename: 'file.jpg' })で指定できます。 |
| expectedBucketOwner | string | — | リクエストされたバケットを所有するアカウントID。 |