Pobieranie plików za pomocą Cloud Storage w technologii Flutter

Cloud Storage dla Firebase umożliwia szybkie i łatwe pobieranie plików z zasobnika Cloud Storage udostępnianego i zarządzanego przez Firebase.

Tworzenie referencji

Aby pobrać plik, najpierw utwórz odwołanie do Cloud Storage do pliku, który chcesz pobrać.

Możesz utworzyć odwołanie, dodając ścieżki podrzędne do katalogu głównego zasobnika Cloud Storage, lub utworzyć odwołanie z istniejącego adresu URL gs:// lub https://, który odwołuje się do obiektu w Cloud Storage.

// 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");

Pobieranie plików

Gdy uzyskasz odniesienie, możesz pobrać pliki z Cloud Storage, wywołując getData(). Jeśli wolisz pobrać plik za pomocą innej biblioteki, możesz uzyskać adres URL pobierania za pomocą getDownloadUrl().

Pobieranie w pamięci

Pobierz plik na UInt8List za pomocą metody getData(). Jest to najprostszy sposób pobierania pliku, ale wymaga załadowania całej zawartości pliku do pamięci. Jeśli zażądasz pliku większego niż dostępna pamięć aplikacji, aplikacja ulegnie awarii. Aby zapobiec problemom z pamięcią, getData() pobiera maksymalną liczbę bajtów. Ustaw maksymalny rozmiar na wartość, z którą Twoja aplikacja sobie poradzi, lub użyj innej metody pobierania.

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.
}

Pobieranie do pliku lokalnego

Metoda writeToFile() pobiera plik bezpośrednio na urządzenie lokalne. Użyj tej metody, jeśli użytkownicy chcą mieć dostęp do pliku offline lub udostępnić go w innej aplikacji. Funkcja writeToFile() zwraca obiekt DownloadTask, którego możesz użyć do zarządzania pobieraniem i monitorowania jego stanu.

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

Pobieranie danych za pomocą adresu URL

Jeśli masz już infrastrukturę pobierania opartą na adresach URL lub po prostu chcesz udostępnić adres URL, możesz uzyskać adres URL pobierania pliku, wywołując metodę getDownloadURL() w odniesieniu do Cloud Storage.

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

Obsługa błędów

Błędy pobierania mogą wystąpić z różnych powodów, np. z powodu braku pliku lub braku uprawnień użytkownika do uzyskania dostępu do wybranego pliku. Więcej informacji o błędach znajdziesz w sekcji Obsługa błędów w dokumentacji.

Pełny przykład

Pełny przykład pobierania z obsługą błędów znajdziesz poniżej:

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

Możesz też pobierać i aktualizować metadane plików przechowywanych w Cloud Storage.