在 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 中的檔案的元資料