在 Flutter 中使用 Cloud Storage 下載檔案

您可以使用 Cloud Storage for Firebase,從 Firebase 提供及管理的 Cloud Storage 值區快速輕鬆下載檔案。

可建立參照

如要下載檔案,請先建立 Cloud Storage 參照,指向要下載的檔案。

您可以將子項路徑附加至 Cloud Storage 值區的根目錄,藉此建立參照,或是透過參照 Cloud Storage 中物件的現有 gs://https:// 網址建立參照。

// 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() 取得下載網址。

在記憶體中下載

使用 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;
  }
});

透過網址下載資料

如果您已擁有以網址為基礎的下載基礎架構,或是只想分享網址,您可以呼叫 Cloud Storage 參照的 getDownloadURL() 方法,取得檔案的下載網址。

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 中的檔案。