Cloud Storage for Firebase позволяет быстро и легко загружать файлы из Cloud Storage , предоставляемого и управляемого Firebase.
Создать ссылку
Чтобы загрузить файл, сначала создайте ссылку на Cloud Storage для файла, который вы хотите загрузить.
Вы можете создать ссылку, добавив дочерние пути к корню вашего контейнера Cloud Storage , или вы можете создать ссылку из существующего URL-адреса gs://
или https://
ссылающегося на объект в Cloud Storage .
Kotlin
// Create a storage reference from our app val storageRef = storage.reference // Create a reference with an initial file path and name val pathReference = storageRef.child("images/stars.jpg") // Create a reference to a file from a Google Cloud Storage URI val gsReference = storage.getReferenceFromUrl("gs://bucket/images/stars.jpg") // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! val httpsReference = storage.getReferenceFromUrl( "https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg", )
Java
// Create a storage reference from our app StorageReference storageRef = storage.getReference(); // Create a reference with an initial file path and name StorageReference pathReference = storageRef.child("images/stars.jpg"); // Create a reference to a file from a Google Cloud Storage URI StorageReference gsReference = storage.getReferenceFromUrl("gs://bucket/images/stars.jpg"); // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! StorageReference httpsReference = storage.getReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");
Скачать файлы
Получив ссылку, вы можете загрузить файлы из Cloud Storage , вызвав getBytes()
или getStream()
. Если вы предпочитаете загрузить файл с помощью другой библиотеки, вы можете получить URL-адрес загрузки с помощью getDownloadUrl()
.
Загрузить в память
Загрузите файл в byte[]
с помощью метода getBytes()
. Это самый простой способ загрузить файл, но он должен загрузить все содержимое файла в память. Если вы запросите файл, размер которого превышает доступную память вашего приложения, приложение выйдет из строя. Чтобы защититься от проблем с памятью, getBytes()
загружает максимальное количество байтов. Установите максимальный размер, который, как вы знаете, может обработать ваше приложение, или используйте другой метод загрузки.
Kotlin
var islandRef = storageRef.child("images/island.jpg") val ONE_MEGABYTE: Long = 1024 * 1024 islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener { // Data for "images/island.jpg" is returned, use this as needed }.addOnFailureListener { // Handle any errors }
Java
StorageReference islandRef = storageRef.child("images/island.jpg"); final long ONE_MEGABYTE = 1024 * 1024; islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() { @Override public void onSuccess(byte[] bytes) { // Data for "images/island.jpg" is returns, use this as needed } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } });
Загрузить в локальный файл
Метод getFile()
загружает файл напрямую на локальное устройство. Используйте его, если ваши пользователи хотят иметь доступ к файлу в автономном режиме или поделиться файлом в другом приложении. getFile()
возвращает DownloadTask
, который вы можете использовать для управления загрузкой и отслеживания ее статуса.
Kotlin
islandRef = storageRef.child("images/island.jpg") val localFile = File.createTempFile("images", "jpg") islandRef.getFile(localFile).addOnSuccessListener { // Local temp file has been created }.addOnFailureListener { // Handle any errors }
Java
islandRef = storageRef.child("images/island.jpg"); File localFile = File.createTempFile("images", "jpg"); islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { @Override public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { // Local temp file has been created } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } });
Если вы хотите активно управлять загрузками, см. раздел Управление загрузками для получения дополнительной информации.
Загрузить данные через URL
Если у вас уже есть инфраструктура загрузки, основанная на URL-адресах, или вы просто хотите поделиться URL-адресом, вы можете получить URL-адрес для загрузки файла, вызвав метод getDownloadUrl()
для ссылки на Cloud Storage .
Kotlin
storageRef.child("users/me/profile.png").downloadUrl.addOnSuccessListener { // Got the download URL for 'users/me/profile.png' }.addOnFailureListener { // Handle any errors }
Java
storageRef.child("users/me/profile.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { // Got the download URL for 'users/me/profile.png' } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } });
Загрузка изображений с помощью FirebaseUI
FirebaseUI предоставляет простые, настраиваемые и готовые к производству собственные мобильные привязки для устранения шаблонного кода и продвижения лучших практик Google. Используя FirebaseUI, вы можете быстро и легко загружать, кэшировать и отображать изображения из Cloud Storage используя нашу интеграцию с Glide .
Сначала добавьте FirebaseUI в ваш app/build.gradle
:
dependencies { // FirebaseUI Storage only implementation 'com.firebaseui:firebase-ui-storage:9.0.0' }
Затем вы можете загружать изображения непосредственно из Cloud Storage в ImageView
:
Kotlin
// Reference to an image file in Cloud Storage val storageReference = Firebase.storage.reference // ImageView in your Activity val imageView = findViewById<ImageView>(R.id.imageView) // Download directly from StorageReference using Glide // (See MyAppGlideModule for Loader registration) Glide.with(context) .load(storageReference) .into(imageView)
Java
// Reference to an image file in Cloud Storage StorageReference storageReference = FirebaseStorage.getInstance().getReference(); // ImageView in your Activity ImageView imageView = findViewById(R.id.imageView); // Download directly from StorageReference using Glide // (See MyAppGlideModule for Loader registration) Glide.with(context) .load(storageReference) .into(imageView);
Обработка изменений жизненного цикла активности
Загрузки продолжаются в фоновом режиме даже после изменения жизненного цикла активности (например, отображения диалогового окна или поворота экрана). Все слушатели, которых вы прикрепили, также останутся прикреплёнными. Это может привести к неожиданным результатам, если они будут вызваны после остановки активности.
Эту проблему можно решить, подписав слушателей на область действия, чтобы автоматически отменить их регистрацию, когда действие останавливается. Затем используйте метод getActiveDownloadTasks
, когда действие перезапускается, чтобы получить задачи загрузки, которые все еще выполняются или недавно завершены.
Приведенный ниже пример демонстрирует это, а также показывает, как сохранить используемый путь ссылки на хранилище.
Kotlin
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // If there's a download in progress, save the reference so you can query it later outState.putString("reference", storageRef.toString()) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) // If there was a download in progress, get its reference and create a new StorageReference val stringRef = savedInstanceState.getString("reference") ?: return storageRef = Firebase.storage.getReferenceFromUrl(stringRef) // Find all DownloadTasks under this StorageReference (in this example, there should be one) val tasks = storageRef.activeDownloadTasks if (tasks.size > 0) { // Get the task monitoring the download val task = tasks[0] // Add new listeners to the task using an Activity scope task.addOnSuccessListener(this) { // Success! // ... } } }
Java
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // If there's a download in progress, save the reference so you can query it later if (mStorageRef != null) { outState.putString("reference", mStorageRef.toString()); } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // If there was a download in progress, get its reference and create a new StorageReference final String stringRef = savedInstanceState.getString("reference"); if (stringRef == null) { return; } mStorageRef = FirebaseStorage.getInstance().getReferenceFromUrl(stringRef); // Find all DownloadTasks under this StorageReference (in this example, there should be one) List<FileDownloadTask> tasks = mStorageRef.getActiveDownloadTasks(); if (tasks.size() > 0) { // Get the task monitoring the download FileDownloadTask task = tasks.get(0); // Add new listeners to the task using an Activity scope task.addOnSuccessListener(this, new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { @Override public void onSuccess(FileDownloadTask.TaskSnapshot state) { // Success! // ... } }); } }
Обработка ошибок
Существует ряд причин, по которым могут возникать ошибки при загрузке, включая отсутствие файла или отсутствие у пользователя разрешения на доступ к нужному файлу. Более подробную информацию об ошибках можно найти в разделе Handle Errors документации.
Полный пример
Полный пример загрузки с обработкой ошибок показан ниже:
Kotlin
storageRef.child("users/me/profile.png").getBytes(Long.MAX_VALUE).addOnSuccessListener { // Use the bytes to display the image }.addOnFailureListener { // Handle any errors }
Java
storageRef.child("users/me/profile.png").getBytes(Long.MAX_VALUE).addOnSuccessListener(new OnSuccessListener<byte[]>() { @Override public void onSuccess(byte[] bytes) { // Use the bytes to display the image } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } });
Вы также можете получать и обновлять метаданные для файлов, хранящихся в Cloud Storage .