Flutter で Cloud Storage を使用してファイルをダウンロードする

Cloud Storage for Firebase を使用すると、Firebase によって提供、管理される Cloud Storage バケットからファイルを迅速かつ容易にダウンロードできます。

参照を作成する

ファイルをダウンロードするには、まずダウンロードするファイルへの Cloud Storage 参照を作成します。

参照は、Cloud Storage バケットのルートに子パスを付加して作成することも、Cloud Storage のオブジェクトを参照する既存の gs:// または https:// URL から作成することもできます。

// Create a storage reference from our app
final storageRef = FirebaseStorage.instance.ref();

// Create a reference with an initial file path and name
final pathReference = storageRef.child("images/stars.jpg");

// Create a reference to a file from a Google Cloud Storage URI
final gsReference =
    FirebaseStorage.instance.refFromURL("gs://YOUR_BUCKET/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
final httpsReference = FirebaseStorage.instance.refFromURL(
    "https://firebasestorage.googleapis.com/b/YOUR_BUCKET/o/images%20stars.jpg");

ファイルをダウンロードする

参照を作成したら、getData() または getStream() を呼び出して Cloud Storage からファイルをダウンロードできます。別のライブラリのファイルをダウンロードしたい場合は、getDownloadUrl() を使用してダウンロード URL を取得できます。

メモリにダウンロードする

getData() メソッドを使用してファイルを UInt8List にダウンロードします。これは最も簡単にファイルをダウンロードできる方法ですが、ファイルのコンテンツ全体をメモリ内に読み込む必要があります。アプリで使用できるメモリよりも大きなファイルをリクエストするとアプリがクラッシュするため、メモリの問題が発生しないように、getData() にダウンロードの最大バイト数を設定します。アプリで処理できる範囲内で最大サイズを設定するか、別のダウンロード メソッドを使用してください。

final islandRef = storageRef.child("images/island.jpg");

try {
  const oneMegabyte = 1024 * 1024;
  final Uint8List? data = await islandRef.getData(oneMegabyte);
  // Data for "images/island.jpg" is returned, use this as needed.
} on FirebaseException catch (e) {
  // Handle any errors.
}

ローカル ファイルにダウンロードする

writeToFile() メソッドは、ファイルをローカル デバイスに直接ダウンロードします。ユーザーがオフライン中にファイルにアクセスしたい場合や、別のアプリでファイルを共有したい場合は、このメソッドを使用します。writeToFile() から返される DownloadTask を使用して、ダウンロードの管理とダウンロード ステータスのモニタリングを行うことができます。

final islandRef = storageRef.child("images/island.jpg");

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

URL 経由でデータをダウンロードする

URL をベースにしたダウンロード インフラストラクチャがすでにある場合や、単に URL を共有したい場合は、Cloud Storage 参照に対して getDownloadURL() メソッドを呼び出してファイルのダウンロード URL を取得できます。

final imageUrl =
    await storageRef.child("users/me/profile.png").getDownloadURL();

エラーを処理する

ダウンロード時にエラーが発生する理由としては、ファイルが存在しない、目的のファイルへのアクセス権がないなど、多くの理由が考えられます。エラーについての詳細は、ドキュメントのエラーを処理するのセクションをご覧ください。

ダウンロードとエラー処理の完全な例を以下に示します。

final islandRef = storageRef.child("images/island.jpg");

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

Cloud Storage に保存されているファイルのメタデータを取得して更新することもできます。