Dateien mit Cloud Storage auf Flutter hochladen

Mit Cloud Storage for Firebase können Sie schnell und einfach Dateien 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 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 einen entsprechenden Verweis erstellt haben, rufen Sie die putFile(), putString(), oder putData() Methode 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 eine Datei beispielsweise im Dokumentenverzeichnis der Anwendung befindet, verwenden Sie das offizielle path_providerPaket, 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 einem String hochladen

Mit der Methode putString() können Sie Daten als unformatierter, base64, base64url, oder data_url codierter String hochladen. Beispiel: So laden Sie 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 einer Uint8List hochladen, wenn das Hochladen eines Strings oder einer File nicht praktikabel ist. Rufen Sie in diesem Fall die putData() Methode mit Ihren Daten auf:

try {
  // Upload raw data.
  await mountainsRef.putData(data);
} on firebase_core.FirebaseException catch (e) {
  // ...
}

Download-URL abrufen

Nach dem Hochladen einer Datei können Sie eine URL zum Herunterladen der Datei abrufen, indem Sie die getDownloadUrl() Methode für die Reference aufrufen:

await mountainsRef.getDownloadURL();

Dateimetadaten hinzufügen

Sie können beim Hochladen von Dateien auch Metadaten einfügen. Diese Metadaten enthalten typische Dateimetadaten-Attribute wie contentType (allgemein als MIME-Typ bezeichnet). Die putFile() Methode leitet den MIME-Typ automatisch aus der File Erweiterung ab. Sie können den automatisch erkannten Typ jedoch überschreiben, indem Sie contentType in den Metadaten angeben. Wenn Sie keinen contentType angeben und Cloud Storage keinen Standardwert aus der Dateierweiterung 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

Sie können Uploads nicht nur starten, sondern auch mit den pause(), resume() und cancel() Methoden pausieren, fortsetzen und abbrechen. Bei Ereignissen zum Pausieren und Fortsetzen werden pause bzw. progress Statusänderungen ausgelöst. Wenn Sie einen Upload abbrechen, schlägt er 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');

Upload-Fortschritt beobachten

Sie können den Ereignisstream einer Aufgabe abhören, um Erfolg, Fehler, Fortschritt oder Pausen in Ihrer Upload-Aufgabe 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 füllen.
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 aufgrund von Netzwerk-Time-outs, Autorisierungsfehlern oder durch Abbrechen der Aufgabe passieren.
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 beispielsweise, 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 Fehlerbehebung in der Dokumentation.

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 nun Dateien hochgeladen haben, erfahren Sie, wie Sie sie aus Cloud Storage herunterladen.