Cloud Storage dla Firebase umożliwia szybkie i łatwe przesyłanie plików do zasobnika Cloud Storage udostępnianego i zarządzanego przez Firebase.
Prześlij pliki
Aby przesłać plik do Cloud Storage, musisz najpierw utworzyć odniesienie do pełnej ścieżki pliku, w tym jego nazwy.
// 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 przesyłać danych z odwołaniem do katalogu głównego zasobnika Cloud Storage. Odwołanie musi wskazywać adres URL podrzędny.
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 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 ciągu znaków
Dane możesz przesłać jako nieprzetworzony ciąg znaków zakodowany w formacie base64
, base64url
lub data_url
za pomocą metody putString()
. 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 wpisane na niższym poziomie w formie 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 do jego pobrania, wywołując metodę getDownloadUrl()
na obiekcie Reference
:
await mountainsRef.getDownloadURL();
Dodawanie metadanych pliku
Podczas przesyłania plików możesz też uwzględnić metadane.
Te metadane zawierają typowe właściwości metadanych plików, takie jak contentType
(zwykle określane jako typ MIME). Metoda putFile()
automatycznie wnioskuje typ MIME z rozszerzenia File
, ale możesz zastąpić automatycznie wykryty typ, określając contentType
w metadanych. Jeśli nie podasz contentType
, a Cloud Storage nie może wywnioskować domyślnej wartości z rozszerzenia pliku, Cloud Storage użyje application/octet-stream
. Zobacz Używanie metadanych pliku.
try {
await mountainsRef.putFile(file, SettableMetadata(
contentType: "image/jpeg",
));
} on firebase_core.FirebaseException catch (e) {
// ...
}
Zarządzaj przesyłaniem
Oprócz rozpoczynania przesyłania możesz je wstrzymywać, wznawiać i anulować za pomocą metod pause()
, resume()
i cancel()
. Zdarzenia wstrzymania i wznowienia powodują odpowiednio zmiany stanu pause
i progress
. Anulowanie przesyłania powoduje, że przesyłanie kończy się niepowodzeniem z błędem wskazującym, że 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 słuchać strumienia zdarzeń zadania, aby obsługiwać powodzenie, niepowodzenie, postęp lub wstrzymanie zadania przesyłania:
Typ zdarzenia | Typowe zastosowanie |
---|---|
TaskState.running |
Wysyłane okresowo podczas przesyłania danych. Można ich używać do wypełniania wskaźnika przesyłania lub pobierania. |
TaskState.paused |
Wysyłany za każdym razem, gdy zadanie zostanie wstrzymane. |
TaskState.success |
Wysyłany po pomyślnym zakończeniu zadania. |
TaskState.canceled |
Emitowany za każdym razem, gdy zadanie zostanie anulowane. |
TaskState.error |
Wysyłany, gdy przesyłanie się nie powiedzie. Może to być spowodowane przerwami w dostępie do sieci, błędami autoryzacji lub anulowaniem 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
Istnieje wiele powodów, dla których podczas przesyłania mogą wystąpić błędy, np. brak lokalnego pliku lub brak uprawnień użytkownika do przesłania 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 przesyłania z monitorowaniem postępu i obsługą błędów znajduje się poniżej:
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;
}
});
Po przesłaniu plików dowiedz się, jak pobrać je z Cloud Storage.