Загружайте файлы с помощью Cloud Storage на Flutter

Cloud Storage for Firebase позволяет быстро и легко загружать файлы в хранилище Cloud Storage, предоставляемое и управляемое Firebase.

Загрузка файлов

Для загрузки файла в Cloud Storage необходимо сначала создать ссылку на полный путь к файлу, включая его имя.

// 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);

После создания соответствующей ссылки вы вызываете методы putFile() , putString() или putData() для загрузки файла в Cloud Storage.

Вы не можете загружать данные, ссылаясь на корневой каталог вашего хранилища Cloud Storage. Ваша ссылка должна указывать на дочерний URL-адрес.

Загрузка из файла

Для загрузки файла необходимо сначала получить абсолютный путь к его местоположению на устройстве. Например, если файл находится в каталоге документов приложения, используйте официальный пакет path_provider для генерации пути к файлу и передайте его в функцию 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) {
  // ...
}

Загрузка из строки

You can upload data as a raw, base64 , base64url , or data_url encoded string using the putString() method. For example, to upload a text string encoded as a Data URL:

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

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

Загрузка исходных данных

В тех случаях, когда загрузка строки или File нецелесообразна, вы можете загружать данные с более низким уровнем типизации в виде Uint8List . В этом случае вызовите метод putData() с вашими данными:

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

Получить URL для скачивания

После загрузки файла вы можете получить URL-адрес для его скачивания, вызвав метод getDownloadUrl() из Reference .

await mountainsRef.getDownloadURL();

Добавить метаданные файла

При загрузке файлов вы также можете добавлять метаданные. Эти метаданные содержат типичные свойства метаданных файла, такие как contentType (обычно называемый MIME-типом). Метод putFile() автоматически определяет MIME-тип по расширению File , но вы можете переопределить автоматически определенный тип, указав contentType в метаданных. Если вы не указываете contentType , и Cloud Storage не может определить значение по умолчанию по расширению файла, Cloud Storage использует application/octet-stream . См. раздел «Использование метаданных файла» .

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

Управление загрузками

Помимо начала загрузки, вы можете приостанавливать, возобновлять и отменять загрузку, используя методы pause() , resume() и cancel() . События паузы и возобновления вызывают изменения состояния pause и progress соответственно. Отмена загрузки приводит к сбою загрузки с ошибкой, указывающей на то, что загрузка была отменена.

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');

Отслеживание хода загрузки

You can listen to a task's event stream to handle success, failure, progress, or pauses in your upload task:

Тип события Типичное использование
TaskState.running Выводится периодически по мере передачи данных и может использоваться для заполнения индикатора загрузки/выгрузки.
TaskState.paused Генерируется всякий раз, когда задача приостанавливается.
TaskState.success Сообщается при успешном завершении задачи.
TaskState.canceled Emitted any time the task is canceled.
TaskState.error Сообщения выводятся при неудачной загрузке. Это может произойти из-за таймаутов сети, ошибок авторизации или отмены задачи.
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;
  }
});

Обработка ошибок

При загрузке могут возникать ошибки по ряду причин, включая отсутствие локального файла или отсутствие у пользователя разрешения на загрузку нужного файла. Более подробную информацию об ошибках можно найти в разделе «Обработка ошибок» документации.

Полный пример

Полный пример загрузки с отслеживанием хода процесса и обработкой ошибок показан ниже:

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;
  }
});

Теперь, когда вы загрузили файлы, давайте узнаем, как их скачать из облачного хранилища.