Загрузка файлов с помощью Cloud Storage на Flutter

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

Создать ссылку

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

Вы можете создать ссылку, добавив дочерние пути к корню сегмента Cloud Storage, либо создать ссылку на основе существующего URL- gs:// или https:// , ссылающегося на объект в Cloud Storage.

// Create a storage reference from our app
final storageRef = FirebaseStorage.instance.ref();

// Create a reference with an initial file path and name
final pathReference = storageRef.child("images/stars.jpg");

// Create a reference to a file from a Google Cloud Storage URI
final gsReference =
    FirebaseStorage.instance.refFromURL("gs://YOUR_BUCKET/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
final httpsReference = FirebaseStorage.instance.refFromURL(
    "https://firebasestorage.googleapis.com/b/YOUR_BUCKET/o/images%20stars.jpg");

Скачать файлы

Получив ссылку, вы можете загружать файлы из Cloud Storage, вызвав getData() или getStream() . Если вы предпочитаете загрузить файл с помощью другой библиотеки, вы можете получить URL-адрес загрузки с помощью getDownloadUrl() .

Загрузить в память

Загрузите файл в UInt8List с помощью метода getData() . Это самый простой способ загрузки файла, однако он должен загружать в память все содержимое вашего файла. Если вы запросите файл, размер которого превышает доступную память вашего приложения, ваше приложение выйдет из строя. Чтобы защититься от проблем с памятью, getData() загружает максимальное количество байтов. Установите максимальный размер, который, как вы знаете, может выдержать ваше приложение, или используйте другой метод загрузки.

final islandRef = storageRef.child("images/island.jpg");

try {
  const oneMegabyte = 1024 * 1024;
  final Uint8List? data = await islandRef.getData(oneMegabyte);
  // Data for "images/island.jpg" is returned, use this as needed.
} on FirebaseException catch (e) {
  // Handle any errors.
}

Загрузить в локальный файл

Метод writeToFile() загружает файл непосредственно на локальное устройство. Используйте это, если ваши пользователи хотят иметь доступ к файлу в автономном режиме или поделиться файлом в другом приложении. writeToFile() возвращает DownloadTask , который можно использовать для управления загрузкой и отслеживания ее статуса.

final islandRef = storageRef.child("images/island.jpg");

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

Загрузить данные через URL

Если у вас уже есть инфраструктура загрузки, основанная на URL-адресах, или вы просто хотите, чтобы URL-адрес был общим, вы можете получить URL-адрес загрузки для файла, вызвав метод getDownloadURL() для ссылки на облачное хранилище.

final imageUrl =
    await storageRef.child("users/me/profile.png").getDownloadURL();

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

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

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

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

final islandRef = storageRef.child("images/island.jpg");

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

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