Загружайте файлы с помощью 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) {
  // ...
}

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

С помощью метода putString() вы можете загружать данные в виде необработанной строки, строки в формате base64 , base64url или data_url . Например, чтобы загрузить текстовую строку, закодированную как 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');

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

Вы можете отслеживать поток событий задачи, чтобы обрабатывать успешные, неудачные, текущие или приостановленные процессы загрузки:

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

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