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

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

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

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

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

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

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