Облачное хранилище для Firebase позволяет быстро и легко загружать файлы из контейнера облачного хранилища , предоставляемого и управляемого 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");
Скачать файлы
Получив ссылку, вы можете загрузить файлы из облачного хранилища, вызвав метод getData()
. Если вы предпочитаете загрузить файл с помощью другой библиотеки, вы можете получить 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;
}
});
Вы также можете получать и обновлять метаданные для файлов, хранящихся в облачном хранилище.