Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Laden Sie Dateien mit Cloud Storage auf Flutter hoch

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Mit Cloud Storage for Firebase können Sie Dateien schnell und einfach in einen von Firebase bereitgestellten und verwalteten Cloud Storage- Bucket hochladen.

Daten hochladen

Um eine Datei in Cloud Storage hochzuladen, erstellen Sie zunächst 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 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. Ihre Referenz muss auf eine untergeordnete URL verweisen.

Aus einer Datei hochladen

Um eine Datei hochzuladen, müssen Sie zuerst den absoluten Pfad zu ihrem Speicherort auf dem Gerät abrufen. Wenn beispielsweise eine Datei im Dokumentenverzeichnis der Anwendung vorhanden ist, verwenden Sie das offizielle path_provider -Paket, 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) {
  // ...
}

Hochladen aus einer Zeichenfolge

Mit der Methode putString() können Sie Daten als Raw-, base64 , base64url oder data_url codierte Zeichenfolge hochladen. So laden Sie beispielsweise eine als Daten-URL codierte Textzeichenfolge hoch:

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

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

Hochladen von Rohdaten

Sie können typisierte Daten auf niedrigerer Ebene in Form einer Uint8List für die Fälle hochladen, in denen das Hochladen einer Zeichenfolge 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) {
  // ...
}

Holen Sie sich eine Download-URL

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

await mountainsRef.getDownloadURL();

Dateimetadaten hinzufügen

Sie können beim Hochladen von Dateien auch Metadaten einbeziehen. Diese Metadaten enthalten typische Datei-Metadaten-Eigenschaften wie contentType (allgemein als MIME-Typ bezeichnet). Die putFile() Methode leitet den MIME-Typ automatisch von der File ab, aber Sie können den automatisch erkannten Typ überschreiben, indem Sie contentType in den Metadaten angeben. Wenn Sie keinen contentType und Cloud Storage aus der Dateierweiterung keinen Standardwert ableiten kann, verwendet Cloud Storage application/octet-stream . Siehe Verwenden von Dateimetadaten .

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

Uploads verwalten

Zusätzlich zum Starten von Uploads können Sie Uploads mit den Methoden pause() , resume() und cancel() anhalten, fortsetzen und abbrechen. Pause- und Resume-Ereignisse lösen pause bzw. progress aus. Das Abbrechen eines Uploads führt dazu, dass der Upload mit einem Fehler fehlschlägt, 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');

Überwachen Sie den Upload-Fortschritt

Sie können den Ereignisstream einer Aufgabe abhören, um Erfolg, Fehler, Fortschritt oder Pausen in Ihrer Upload-Aufgabe zu behandeln:

Ereignistyp Typische Verwendung
TaskState.running Wird regelmäßig ausgegeben, wenn Daten übertragen werden, und kann verwendet werden, um eine Upload/Download-Anzeige zu füllen.
TaskState.paused Wird jedes Mal ausgegeben, wenn die Aufgabe angehalten wird.
TaskState.success Wird ausgegeben, wenn die Aufgabe erfolgreich abgeschlossen wurde.
TaskState.canceled Wird jedes Mal ausgegeben, wenn die Aufgabe abgebrochen wird.
TaskState.error Wird ausgegeben, wenn der Upload fehlgeschlagen ist. Dies kann aufgrund von Netzwerkzeitüberschreitungen, Autorisierungsfehlern oder dem Abbrechen der Aufgabe geschehen.
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, darunter die lokale Datei, die nicht vorhanden ist, oder der Benutzer, der keine Berechtigung zum Hochladen der gewünschten Datei hat. Weitere Informationen zu Fehlern finden Sie im Abschnitt Fehlerbehandlung der Dokumentation.

Vollständiges Beispiel

Ein vollständiges Beispiel eines Uploads mit Fortschrittsüberwachung und Fehlerbehandlung ist unten dargestellt:

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, wie Sie sie aus Cloud Storage herunterladen .