ファイルのダウンロード
アプリ内の体験をさらにカスタマイズするには、Amplify Library for StorageからgetUrlまたはdownloadData APIを使用できます。
URLからファイルを取得またはダウンロードする
getUrl APIを使用すると、デフォルトで900秒または15分間有効な署名付きURLを取得できます。このURLを使用して、ユーザーがクリックするためのダウンロードリンクを作成できます。expiresAtプロパティはURLが期限切れになる時間を表すDateオブジェクトです。
let url = try await Amplify.Storage.getURL( path: .fromString("public/example/path"))print("完了: \(url)")ファイルの存在を確認
ダウンロード可能なURLを作成する場合、AWSStorageGetURLOptionsでvalidateObjectExistenceをtrueに設定することで、ファイルが存在するかどうかを確認することができます。ファイルにアクセスできないか存在しない場合、StorageErrorがスローされます。これにより、署名付きURLを生成するときにオブジェクトが存在するかどうかをチェックでき、その後、そのオブジェクトをダウンロードするために使用できます。
let url = try await Amplify.Storage.getURL( path: .fromString("public/example/path"), options: .init( pluginOptions: AWSStorageGetURLOptions( validateObjectExistence: true ) ))すべてのgetURLオプション
| オプション | タイプ | デフォルト | 説明 |
|---|---|---|---|
| expires | Int | 18000 | URLが期限切れになるまでの秒数 |
| bucket | StorageBucket | Amplify設定のデフォルトバケット | オブジェクトが保存されているバケット |
| pluginOptions.method | StorageAccessMethod | .get | .getはダウンロードURLを生成します。.putはアップロードURLを生成します。 |
| pluginOptions.validateObjectExistence | Bool | false | URLを生成する前にオブジェクトが存在するかどうかをチェックするかどうか。メソッドが.putの場合はスキップされます。 |
ファイルのダウンロード
ローカルファイルへのダウンロード
downloadFile APIを使用してファイルをクライアント上にローカルにダウンロードします。
URLファイルにダウンロードできます (via Amplify.Storage.downloadFile):
let downloadToFileUrl = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("myFile.txt")
let downloadTask = Amplify.Storage.downloadFile( path: .fromString("public/example/path"), local: downloadToFileUrl, options: nil)Task { for await progress in await downloadTask.progress { print("進捗: \(progress)") }}try await downloadTask.valueprint("完了")let downloadToFileUrl = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("myFile.txt")
let downloadTask = Amplify.Storage.downloadFile( path: .fromString("public/example/path"), local: downloadToFileUrl, options: nil)let progressSink = downloadTask .inProcessPublisher .sink { progress in print("進捗: \(progress)") }
let resultSink = downloadTask .resultPublisher .sink { if case let .failure(storageError) = $0 { print("失敗: \(storageError.errorDescription). \(storageError.recoverySuggestion)") } } receiveValue: { print("完了") }メモリ内データへのダウンロード
Dataオブジェクトのメモリ内バッファにダウンロードできます (Amplify.Storage.downloadData経由):
let downloadTask = Amplify.Storage.downloadData( path: .fromString("public/example/path"))Task { for await progress in await downloadTask.progress { print("進捗: \(progress)") }}let data = try await downloadTask.valueprint("完了: \(data)")let downloadTask = Amplify.Storage.downloadData( path: .fromString("public/example/path"))let progressSink = downloadTask .inProcessPublisher .sink { progress in print("進捗: \(progress)") }
let resultSink = downloadTask .resultPublisher .sink { if case let .failure(storageError) = $0 { print("失敗: \(storageError.errorDescription). \(storageError.recoverySuggestion)") } } receiveValue: { data in print("完了: \(data)") }指定されたバケットからのダウンロード
bucketオプションを指定して、特定のバケットからダウンロード操作を実行することもできます。
.fromOutputs(name:)を使用して、Amplify Backendで割り当てられたターゲットバケットの名前を表す文字列を指定できます。
// ファイルにダウンロードlet downloadTask = Amplify.Storage.downloadFile( path: .fromString("public/example/path"), local: downloadToFileUrl, options: .init( bucket: .fromOutputs(name: "secondBucket") ))
// データにダウンロードlet downloadTask = Amplify.Storage.downloadData( path: .fromString("public/example/path"), options: .init( bucket: .fromOutputs(name: "secondBucket") )).fromBucketInfo(_:)を使用して、バケット名とリージョンを直接指定することもできます。
// ファイルにダウンロードlet downloadTask = Amplify.Storage.downloadFile( path: .fromString("public/example/path"), local: downloadToFileUrl, options: .init( bucket: .fromBucketInfo(.init( bucketName: "another-bucket-name", region: "another-bucket-region") ) ))
// データにダウンロードlet downloadTask = Amplify.Storage.downloadData( path: .fromString("public/example/path"), options: .init( bucket: .fromBucketInfo(.init( bucketName: "another-bucket-name", region: "another-bucket-region") ) ))ダウンロードを一時停止、再開、キャンセル
downloadDataまたはdownloadFileへの呼び出しは、実際にダウンロードを実行しているタスクへの参照を返します。
以下に示すように、タスクを一時停止してから再開するか、タスクをキャンセルできます。
downloadTask.pause()downloadTask.resume()downloadTask.cancel()