Mit Cloud Storage for Firebase können Sie Dateien schnell und einfach in einen von Firebase bereitgestellten und verwalteten Cloud Storage-Bucket hochladen.
Dateien hochladen
Wenn Sie eine Datei in Cloud Storage hochladen möchten, erstellen Sie zuerst einen Verweis auf den vollständigen Pfad der Datei, einschließlich des Dateinamens.
// 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);
Nachdem Sie eine entsprechende Referenz erstellt haben, rufen Sie die Methode putFile()
, putString()
oder putData()
auf, um die Datei in Cloud Storage hochzuladen.
Sie können keine Daten mit einem Verweis auf das Stammverzeichnis Ihres Cloud Storage-Buckets hochladen. Ihr Verweis muss auf eine untergeordnete URL verweisen.
Aus einer Datei hochladen
Wenn Sie eine Datei hochladen möchten, müssen Sie zuerst den absoluten Pfad zu ihrem Speicherort auf dem Gerät abrufen. Wenn sich beispielsweise eine Datei im Dokumentverzeichnis der Anwendung befindet, verwenden Sie das offizielle Paket path_provider
, um einen Dateipfad zu generieren und an putFile()
zu übergeben:
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) {
// ...
}
Aus einer Zeichenfolge hochladen
Mit der Methode putString()
können Sie Daten als Rohdaten, als base64
-, base64url
- oder data_url
-codierten String hochladen. So laden Sie beispielsweise einen als Daten-URL codierten Textstring hoch:
String dataUrl = 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==';
try {
await mountainsRef.putString(dataUrl, format: PutStringFormat.dataUrl);
} on FirebaseException catch (e) {
// ...
}
Rohdaten hochladen
Sie können typisierte Daten auf niedrigerer Ebene in Form eines Uint8List
hochladen, wenn das Hochladen eines Strings oder File
nicht praktikabel ist. Rufen Sie in diesem Fall die Methode putData()
mit Ihren Daten auf:
try {
// Upload raw data.
await mountainsRef.putData(data);
} on firebase_core.FirebaseException catch (e) {
// ...
}
Download-URL abrufen
Nachdem Sie eine Datei hochgeladen haben, können Sie eine URL zum Herunterladen der Datei abrufen, indem Sie die Methode getDownloadUrl()
für Reference
aufrufen:
await mountainsRef.getDownloadURL();
Dateimetadaten hinzufügen
Sie können auch Metadaten einfügen, wenn Sie Dateien hochladen.
Diese Metadaten enthalten typische Dateimetadaten-Attribute wie contentType
(allgemein als MIME-Typ bezeichnet). Bei der Methode putFile()
wird der MIME-Typ automatisch aus der Erweiterung File
abgeleitet. Sie können den automatisch erkannten Typ jedoch überschreiben, indem Sie contentType
in den Metadaten angeben. Wenn Sie kein contentType
angeben und Cloud Storage kein Standard-contentType
aus der Dateiendung ableiten kann, wird application/octet-stream
verwendet. Weitere Informationen finden Sie unter Dateimetadaten verwenden.
try {
await mountainsRef.putFile(file, SettableMetadata(
contentType: "image/jpeg",
));
} on firebase_core.FirebaseException catch (e) {
// ...
}
Uploads verwalten
Neben dem Starten von Uploads können Sie Uploads mit den Methoden pause()
, resume()
und cancel()
pausieren, fortsetzen und abbrechen. Durch das Pausieren und Fortsetzen von Ereignissen werden die Statusänderungen pause
bzw. progress
ausgelöst. Wenn Sie einen Upload abbrechen, schlägt der Upload mit einem Fehler fehl, der angibt, dass der Upload abgebrochen wurde.
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');
Uploadfortschritt im Blick behalten
Sie können sich den Ereignisstream einer Aufgabe ansehen, um Erfolg, Fehler, Fortschritt oder Pausen bei Ihrer Uploadaufgabe zu verarbeiten:
Ereignistyp | Typische Verwendung |
---|---|
TaskState.running |
Wird regelmäßig ausgegeben, wenn Daten übertragen werden, und kann verwendet werden, um eine Anzeige für Uploads/Downloads zu erstellen. |
TaskState.paused |
Wird immer ausgegeben, wenn die Aufgabe pausiert wird. |
TaskState.success |
Wird ausgegeben, wenn die Aufgabe erfolgreich abgeschlossen wurde. |
TaskState.canceled |
Wird immer ausgegeben, wenn die Aufgabe abgebrochen wird. |
TaskState.error |
Wird ausgegeben, wenn der Upload fehlgeschlagen ist. Das kann an Netzwerk-Timeouts, Autorisierungsfehlern oder daran liegen, dass Sie den Task abbrechen. |
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;
}
});
Fehlerbehandlung
Es gibt eine Reihe von Gründen, warum beim Hochladen Fehler auftreten können. Dazu gehören, dass die lokale Datei nicht vorhanden ist oder der Nutzer keine Berechtigung zum Hochladen der gewünschten Datei hat. Weitere Informationen zu Fehlern finden Sie in der Dokumentation im Abschnitt Fehlerbehebung.
Vollständiges Beispiel
Ein vollständiges Beispiel für einen Upload mit Fortschrittsüberwachung und Fehlerbehandlung finden Sie unten:
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;
}
});
Nachdem Sie Dateien hochgeladen haben, erfahren Sie jetzt, wie Sie sie aus Cloud Storage herunterladen.