Cloud Storage dla Firebase umożliwia szybkie i łatwe przesyłanie plików do zasobnika Cloud Storage udostępnionego i zarządzanego przez Firebase.
Prześlij pliki
Aby przesłać plik do Cloud Storage, najpierw utwórz odwołanie do pełna ścieżka do pliku, w tym nazwa pliku.
// Create a storage reference from our app
final storageRef = FirebaseStorage.instance.ref();
// Create a reference to "mountains.jpg"
final mountainsRef = storageRef.child("mountains.jpg");
// Create a reference to 'images/mountains.jpg'
final mountainImagesRef = storageRef.child("images/mountains.jpg");
// While the file names are the same, the references point to different files
assert(mountainsRef.name == mountainImagesRef.name);
assert(mountainsRef.fullPath != mountainImagesRef.fullPath);
Po utworzeniu odpowiedniego odwołania wywołujesz metodę putFile()
, putString()
lub putData()
, aby przesłać plik do Cloud Storage.
Nie możesz przesłać danych odwołujących się do poziomu głównego Zasobnik Cloud Storage. Odwołanie musi wskazywać podrzędny URL.
Przesyłanie z pliku
Aby przesłać plik, musisz najpierw uzyskać ścieżkę bezwzględną do jego lokalizacji na urządzeniu. Jeśli na przykład plik znajduje się w katalogu dokumentów aplikacji, użyj oficjalnego pakietu path_provider
, aby wygenerować ścieżkę do pliku i przekazać ją do funkcji putFile()
:
Directory appDocDir = await getApplicationDocumentsDirectory();
String filePath = '${appDocDir.absolute}/file-to-upload.png';
File file = File(filePath);
try {
await mountainsRef.putFile(file);
} on firebase_core.FirebaseException catch (e) {
// ...
}
Przesyłanie z łańcucha znaków
Za pomocą metody putString()
możesz przesłać dane jako nieprzetworzony ciąg znaków lub ciąg znaków zakodowany w formacie base64
, base64url
lub data_url
. Aby na przykład przesłać ciąg tekstowy
zakodowany jako adres URL danych:
String dataUrl = 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==';
try {
await mountainsRef.putString(dataUrl, format: PutStringFormat.dataUrl);
} on FirebaseException catch (e) {
// ...
}
Przesyłanie nieprzetworzonych danych
W przypadku, gdy przesyłanie ciągu znaków lub wartości File
jest niepraktyczne, możesz przesłać dane typu niższy w postaci Uint8List
. W tym przypadku wywołaj metodę putData()
z danymi:
try {
// Upload raw data.
await mountainsRef.putData(data);
} on firebase_core.FirebaseException catch (e) {
// ...
}
Uzyskiwanie adresu URL pobierania
Po przesłaniu pliku możesz uzyskać adres URL, aby go pobrać, wywołując
metoda getDownloadUrl()
w Reference
:
await mountainsRef.getDownloadURL();
Dodaj metadane pliku
Możesz też dołączyć metadane podczas przesyłania plików.
Te metadane zawierają typowe właściwości metadanych plików, takie jak contentType
(Powszechnie nazywane typem MIME). Metoda putFile()
automatycznie wykrywa typ MIME na podstawie rozszerzenia File
, ale możesz zastąpić automatycznie wykryty typ, podając contentType
w metadanych. Jeśli nie podasz wartości contentType
, a Cloud Storage nie będzie mogło określić domyślnej wartości na podstawie rozszerzenia pliku, Cloud Storage użyje wartości application/octet-stream
. Przeczytaj artykuł Używanie metadanych plików.
try {
await mountainsRef.putFile(file, SettableMetadata(
contentType: "image/jpeg",
));
} on firebase_core.FirebaseException catch (e) {
// ...
}
Zarządzaj przesyłaniem
Oprócz uruchamiania przesyłania możesz je wstrzymywać, wznawiać i anulować, używając metod pause()
, resume()
i cancel()
. Wstrzymywanie i wznawianie wydarzeń
podnieś odpowiednio zmiany stanu pause
i progress
. Anulowanie
powoduje błąd przesyłania, który wskazuje, że
przesyłanie zostało anulowane.
final task = mountainsRef.putFile(largeFile);
// Pause the upload.
bool paused = await task.pause();
print('paused, $paused');
// Resume the upload.
bool resumed = await task.resume();
print('resumed, $resumed');
// Cancel the upload.
bool canceled = await task.cancel();
print('canceled, $canceled');
Monitorowanie postępu przesyłania
Możesz nasłuchiwać strumienia zdarzeń zadania, aby uwzględniać informacje o sukcesach, niepowodach, postępach i wstrzymywania zadanie przesyłania:
Typ zdarzenia | Typowe zastosowanie |
---|---|
TaskState.running |
Wysyłane okresowo podczas przesyłania danych. Można ich użyć do wypełnienia wskaźnika przesyłania/pobierania. |
TaskState.paused |
Emitowany za każdym razem, gdy zadanie jest wstrzymane. |
TaskState.success |
Emitowany po pomyślnym zakończeniu zadania. |
TaskState.canceled |
Wysyłane po każdym anulowaniu zadania. |
TaskState.error |
Wysyłane, gdy przesyłanie się nie powiodło. Może się to zdarzyć z powodu przerw w dostępie do sieci, błędów autoryzacji lub anulowania zadania. |
mountainsRef.putFile(file).snapshotEvents.listen((taskSnapshot) {
switch (taskSnapshot.state) {
case TaskState.running:
// ...
break;
case TaskState.paused:
// ...
break;
case TaskState.success:
// ...
break;
case TaskState.canceled:
// ...
break;
case TaskState.error:
// ...
break;
}
});
Obsługa błędów
Błędy mogą występować podczas przesyłania z różnych powodów. Oto niektóre z nich: plik lokalny nie istnieje lub użytkownik nie ma uprawnień do przesyłania, odpowiedni plik. Więcej informacji o błędach znajdziesz w Obsługa błędów w dokumentacji.
Pełny przykład
Poniżej przedstawiamy pełny przykład przesyłania z monitorowaniem postępów i obsługą błędów:
final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/path/to/mountains.jpg";
final file = File(filePath);
// Create the file metadata
final metadata = SettableMetadata(contentType: "image/jpeg");
// Create a reference to the Firebase Storage bucket
final storageRef = FirebaseStorage.instance.ref();
// Upload file and metadata to the path 'images/mountains.jpg'
final uploadTask = storageRef
.child("images/path/to/mountains.jpg")
.putFile(file, metadata);
// Listen for state changes, errors, and completion of the upload.
uploadTask.snapshotEvents.listen((TaskSnapshot taskSnapshot) {
switch (taskSnapshot.state) {
case TaskState.running:
final progress =
100.0 * (taskSnapshot.bytesTransferred / taskSnapshot.totalBytes);
print("Upload is $progress% complete.");
break;
case TaskState.paused:
print("Upload is paused.");
break;
case TaskState.canceled:
print("Upload was canceled");
break;
case TaskState.error:
// Handle unsuccessful uploads
break;
case TaskState.success:
// Handle successful uploads on complete
// ...
break;
}
});
Teraz, gdy pliki zostały przesłane, dowiedz się, jak je pobrać z Cloud Storage.