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()
w 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 nazywany typem 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ślnego typu MIME 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.