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();
Добавить метаданные файла
You can also include metadata when you upload files. This metadata contains typical file metadata properties such as contentType (commonly referred to as MIME type). The putFile() method automatically infers the MIME type from the File extension, but you can override the auto-detected type by specifying contentType in the metadata. If you do not provide a contentType and Cloud Storage cannot infer a default from the file extension, Cloud Storage uses application/octet-stream . See Use File Metadata .
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;
}
});
Теперь, когда вы загрузили файлы, давайте узнаем, как их скачать из облачного хранилища.