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

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

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

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