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

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

Загрузить файлы

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

// 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. Ваша ссылка должна указывать на дочерний 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) {
  // ...
}

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

Вы можете загрузить данные как raw, base64 , base64url или data_url закодированную строку с помощью метода putString() . Например, чтобы загрузить текстовую строку, закодированную как Data URL:

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

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

Загрузка необработанных данных

Вы можете загрузить типизированные данные более низкого уровня в форме Uint8List для тех случаев, когда загрузка строки или File нецелесообразна. В этом случае вызовите метод 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;
  }
});

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

Существует ряд причин, по которым могут возникать ошибки при загрузке, включая отсутствие локального файла или отсутствие у пользователя разрешения на загрузку нужного файла. Вы можете найти больше информации об ошибках в разделе Handle Errors документации.

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

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

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

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