Dateien mit Cloud Storage auf Flutter hochladen

Mit Cloud Storage for Firebase können Sie Dateien schnell und einfach in einen Cloud Storage-Bucket hochladen, der von Firebase bereitgestellt und verwaltet wird.

Dateien hochladen

Wenn Sie eine Datei in Cloud Storage hochladen möchten, erstellen Sie zuerst eine Referenz 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 geeignete 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 einer Referenz auf den Stamm Ihres Cloud Storage-Buckets hochladen. Die Referenz 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 Dokumenteverzeichnis der Anwendung befindet, verwenden Sie das offizielle path_provider-Paket, um einen Dateipfad zu generieren und an putFile() weiterzugeben:

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) {
  // ...
}

Über einen String hochladen

Sie können Daten mit der putString()-Methode als Rohstring oder als base64-, base64url- oder data_url-codierten String hochladen. So laden Sie beispielsweise einen Textstring hoch, der als Daten-URL codiert ist:

String dataUrl = 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==';

try {
  await mountainsRef.putString(dataUrl, format: PutStringFormat.dataUrl);
} on FirebaseException catch (e) {
  // ...
}

Rohdaten hochladen

Sie können Daten niedrigerer Ebene in Form einer Uint8List hochladen, wenn der Upload 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 du eine Datei hochgeladen hast, kannst du eine URL zum Herunterladen der Datei abrufen, indem du die getDownloadUrl()-Methode auf der Reference aufrufst:

await mountainsRef.getDownloadURL();

Dateimetadaten hinzufügen

Sie können auch Metadaten beim Hochladen von Dateien angeben. Diese Metadaten enthalten typische Dateimetadateneigenschaften wie contentType (allgemein als MIME-Typ bezeichnet). Bei der putFile()-Methode wird der MIME-Typ automatisch anhand der File-Erweiterung abgeleitet. Sie können den automatisch erkannten Typ jedoch überschreiben, indem Sie in den Metadaten contentType angeben. Wenn Sie keine contentType angeben und Cloud Storage keinen Standard anhand der Dateiendung ableiten kann, verwendet Cloud Storage application/octet-stream. Weitere Informationen finden Sie unter Dateimetadaten verwenden.

try {
  await mountainsRef.putFile(file, SettableMetadata(
    contentType: "image/jpeg",
  ));
} on firebase_core.FirebaseException catch (e) {
  // ...
}

Uploads verwalten

Mit den Methoden pause(), resume() und cancel() können Sie Uploads nicht nur starten, sondern auch pausieren, fortsetzen und abbrechen. Pausieren- und Fortsetzen-Ereignisse lösen jeweils Statusänderungen von pause und progress aus. Wenn Sie einen Upload abbrechen, schlägt er fehl und Sie erhalten eine Fehlermeldung, 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

Du kannst den Ereignisstream einer Aufgabe beobachten, um den Erfolg, den Fehler, den Fortschritt oder die Pausen bei der Uploadaufgabe zu verarbeiten:

Ereignistyp Typische Verwendung
TaskState.running Wird bei der Datenübertragung regelmäßig gesendet und kann zum Ausfüllen eines Upload-/Download-Indikators verwendet werden.
TaskState.paused Wird jedes Mal ausgegeben, wenn die Aufgabe pausiert wird.
TaskState.success Wird gesendet, wenn die Aufgabe erfolgreich abgeschlossen wurde.
TaskState.canceled Wird jedes Mal ausgegeben, wenn die Aufgabe abgebrochen wird.
TaskState.error Wird gesendet, wenn der Upload fehlgeschlagen ist. Das kann auf Netzwerkzeitüberschreitungen, Autorisierungsfehler oder den Abbruch der Aufgabe zurückzuführen sein.
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 kann verschiedene Gründe für Fehler beim Upload geben, z. B. 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 im Abschnitt Fehler beheben.

Vollständiges Beispiel

Unten siehst du ein vollständiges Beispiel für einen Upload mit Fortschrittsüberwachung und Fehlerbehandlung:

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.