Cloud Storage dla Firebase umożliwia szybkie i łatwe pobieranie plików z zasobnika Cloud Storage udostępnionego i zarządzanego przez Firebase.
Tworzenie referencji
Aby pobrać plik, musisz najpierw utworzyć odwołanie do niego w Cloud Storage.
Możesz utworzyć odwołanie, dołączając ścieżki podrzędne do katalogu głównego zasobnika Cloud Storage. Możesz też utworzyć odwołanie z dotychczasowego adresu URL gs://
lub https://
odwołującego 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
Po uzyskaniu referencji możesz pobierać pliki z Cloud Storage, wywołując getData()
lub getStream()
. Jeśli wolisz pobrać plik z innej biblioteki, możesz uzyskać adres URL do pobrania za pomocą getDownloadUrl()
.
Pobieranie w pamięci
Pobierz plik do 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 żądasz pliku większego niż dostępna pamięć aplikacji, aplikacja ulegnie awarii. Aby zapobiec problemom z pamięcią, getData()
pobiera maksymalną liczbę bajtów do pobrania. Ustaw maksymalny rozmiar na wartość, którą aplikacja może obsłużyć, 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 opcji, jeśli użytkownicy chcą mieć dostęp do pliku w trybie offline lub udostępnić go w innej aplikacji. writeToFile()
zwraca 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 do pobrania pliku, wywołując metodę getDownloadURL()
w przypadku odwołania do Cloud Storage.
final imageUrl =
await storageRef.child("users/me/profile.png").getDownloadURL();
Obsługa błędów
Błędy podczas pobierania mogą występować z różnych powodów, m.in. dlatego, że plik nie istnieje lub użytkownik nie ma do niego dostępu. Więcej informacji o błędach znajdziesz w sekcji Przetwarzanie błędów w dokumentacji.
Pełny przykład
Poniżej znajdziesz pełny przykład pobierania z obsługą błędów:
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.