Przesyłanie plików do Cloud Storage w Flutter

Cloud Storage dla Firebase umożliwia szybkie i łatwe przesyłanie plików do Zasobnik Cloud Storage został udostępniony i zarządzane przez Firebase.

Prześlij pliki

Aby przesłać plik do Cloud Storage, najpierw utwórz odwołanie do pełna ścieżka do pliku, w tym nazwa pliku.

// 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 pliku referencyjnego wywołasz metodę Metoda putFile(), putString() lub putData(), aby przesłać plik do Cloud Storage.

Nie możesz przesłać danych odwołujących się do poziomu głównego Zasobnik Cloud Storage. Odwołanie musi wskazywać podrzędny URL.

Prześlij z pliku

Aby przesłać plik, musisz najpierw uzyskać ścieżkę bezwzględną do jego pliku lokalizacji. Jeśli na przykład plik znajduje się w dokumentach aplikacji użyj oficjalnego katalogu path_provider pakiet, aby wygenerować ścieżkę pliku i przekazać go 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) {
  // ...
}

Prześlij z ciągu

Dane możesz przesyłać w postaci nieprzetworzonej, zakodowanej 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

Dane niższego poziomu możesz przesyłać w postaci Uint8List. w przypadkach, gdy przesyłanie ciągu tekstowego lub File nie jest praktyczne. W tym użyj metody 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, aby go pobrać, wywołując metoda getDownloadUrl() w Reference:

await mountainsRef.getDownloadURL();

Dodaj metadane pliku

Możesz też dołączyć metadane podczas przesyłania plików. Te metadane zawierają typowe właściwości metadanych plików, takie jak contentType (Powszechnie nazywane typem MIME). Metoda putFile() automatycznie określa typ MIME z rozszerzenia File, ale możesz zastąp automatycznie wykryty typ, podając w metadanych contentType. Jeśli nie podano contentType, a Cloud Storage nie może wywnioskować Cloud Storage domyślnie używa 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 wstrzymywać, wznawiać i anulować przesyłanie za pomocą: metody pause(), resume() i cancel(). Wstrzymywanie i wznawianie wydarzeń podnieś odpowiednio zmiany stanu pause i progress. Anulowanie powoduje błąd przesyłania, który wskazuje, że przesyłanie 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 nasłuchiwać strumienia zdarzeń zadania, aby uwzględniać informacje o sukcesach, niepowodach, postępach i wstrzymywania zadanie przesyłania:

Typ zdarzenia Typowe zastosowanie
TaskState.running Wysyłane okresowo podczas przesyłania danych. Można ich użyć do wypełnienia wskaźnika przesyłania/pobierania.
TaskState.paused Wysyłane za każdym razem, gdy zadanie jest wstrzymane.
TaskState.success Wysyłane po ukończeniu zadania.
TaskState.canceled Wysyłane po każdym anulowaniu zadania.
TaskState.error Wysyłane, gdy przesyłanie się nie powiodło. Może to wynikać z przekroczenia limitu czasu sieci, błędów autoryzacji lub anulowania 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

Błędy mogą występować podczas przesyłania z różnych powodów. Oto niektóre z nich: plik lokalny nie istnieje lub użytkownik nie ma uprawnień do przesyłania, odpowiedni plik. Więcej informacji o błędach znajdziesz w 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 widać 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;
  }
});

Dowiedz się, jak pobrać pliki z Cloud Storage.