Firebase - загрузка изображений, когда интернет отключен

Firebase имеет отличную возможность использовать свою базу данных и отправлять данные в свою базу данных, даже если вы находитесь в автономном режиме, а затем, когда соединение снова установлено, он автоматически отправляет данные в базу данных.

возможно ли также сделать это с хранилищем Firebase, например, отправлять изображения, даже если Интернет отключен, а затем, когда Интернет снова включен, он будет автоматически отправлять файлы изображений?

Если да, то как я могу это сделать? Если не с Firebase, есть ли другой вариант?


person dani jinji    schedule 08.08.2016    source источник


Ответы (2)


да. Клиент Firebase Storage поддерживает возобновление загрузки. См. документацию Firebase Storage для загрузки (iOS, Интернет, Android).

Оттуда для Android:

uploadTask = mStorageRef.putFile(localFile);
sessionUri = uploadTask.getUploadSessionUri();
//save the sessionUri to persistent storage in case the process dies.

И затем возобновить:

//resume the upload task from where it left off when the process died.
//to do this, pass the sessionUri as the last parameter
uploadTask = mStorageRef.putFile(localFile,
                new StorageMetadata.Builder().build(), sessionUri);

Обновление (20160809)

Один из способов обработки sessionUri:

  1. когда вы создаете uploadTask, получите sessionUri и сохраните его в SharedPreferences приложения.
  2. когда uploadTask завершится, удалите sessionUri из файла SharedPreferences приложения.
  3. когда приложение перезапустится, проверьте, есть ли sessionUri в SharedPreferences. Если да: возобновите загрузку.
person Frank van Puffelen    schedule 08.08.2016
comment
спасибо, два вопроса: //save the sessionUri to persistent storage in case the process dies. что это значит? Как мне это сделать? второй вопрос: //resume the upload task from where it left off when the process died. - как узнать, есть ли в этом сеансе файл с ошибкой? если есть, мне нужно вызвать эту uploadTask прямо при создании активности? (при создании())? Спасибо - person dani jinji; 09.08.2016
comment
Я добавил описание возможного способа реализации этого. - person Frank van Puffelen; 09.08.2016
comment
Я не могу просто сделать sessionUri = uploadTask.getUploadSessionUri();, я должен сделать: sessionUri = uploadTask.getSnapshot().getUploadSessionUri(); иначе это не сработает. поэтому, когда я это делаю, я всегда получаю нулевой указатель на sessionUri, даже если у меня есть подключение к Интернету. - person dani jinji; 10.08.2016
comment
@FrankvanPuffelen: можно ли загрузить файл в хранилище Firebase с помощью «sessionUri», пока мы не в сети. И firebase автоматически загружает этот файл в хранилище firebase, когда приложение подключается к сети. Ваше решение работает, когда мы уже начали загрузку. - person Arpit Patel; 14.11.2016
comment
Фактическая загрузка происходит в отдельном потоке. Но все обратные вызовы отображаются в основном потоке, поэтому они могут манипулировать пользовательским интерфейсом. Если у вас возникли проблемы с этой работой, откройте новый вопрос с минимальным кодом, который воспроизводит проблему. - person Frank van Puffelen; 30.03.2018
comment
@FrankvanPuffelen Извините, я использовал Google.await() до своего слушателя, и это не позволяло моим слушателям зарегистрироваться. Я удалил его, и теперь все работает нормально. Но теперь у меня есть одно сомнение: если я попытаюсь возобновить загрузку с помощью uploadSessionUri, она возобновит загрузку, но getDownloadUrl(), возвращенный в onSuccess(), не является допустимым URL-адресом. Однако файл в полном порядке, как я вижу в консоли. Но URL-адрес недействителен. - person CopsOnRoad; 01.04.2018
comment
@Arpit Patel: я считаю, что, хотя решение Фрэнка работает, если загрузка прервана, вы не можете получить sessionUri, если в какой-то момент у вас не было онлайн-соединения. Для Firebase Storage нет встроенного механизма для хранения этого файла в локальном кеше и отслеживания его. Это доступно только для базы данных Firebase или FireStore. - person Jeff Padgett; 13.04.2018
comment
Я не получаю Sesson Uri в автономном режиме - person ajay dhadhal; 15.11.2018
comment
@JeffPadgett Хорошо, сеанс возникает в результате подключения к экземпляру хранилища Firebase! Эта функция была бы действительно полезной и должна быть реализована в ближайшее время. В настоящее время я работаю над обходным решением на основе SQLite в автономном режиме, чтобы отслеживать локальные файлы, которые будут загружены позже... Есть ли какие-либо другие альтернативы, о которых вы знаете? :) - person varun; 27.03.2019
comment
@varun, именно это я и сделал. За исключением того, что я на самом деле сохранил расположение файлов в общих настройках, потому что я был таким странным. В сети проверьте, есть ли какие-либо файлы, хранящиеся в базе данных SQLite или Shared Preferences, а затем загрузите. - person Jeff Padgett; 30.03.2019
comment
@JeffPadgett О, хорошо, спасибо за ответ. Приятно знать, что это работает так, как ожидалось. Кстати, URL-адреса файлов из хранилища firestore не слишком длинные (около 160 символов)? Есть ли способ сэкономить место в базе данных firestore? :П - person varun; 30.03.2019
comment
Хм, я думаю, это зависит от того, как вы их используете. Если вы знаете базовый URL-адрес ваших документов хранилища firestore, вы можете просто сохранить конечную часть, указав конкретный URL-адрес, поскольку вы уже знаете начальную часть... Но я не уверен, понимаю ли я ваш вопрос. - person Jeff Padgett; 30.03.2019
comment
@JeffPadgett Да, вы прекрасно поняли мой вопрос. Спасибо! Я посмотрю на это! - person varun; 31.03.2019
comment
Можно ли использовать JobScheduler для загрузки после восстановления Интернета? - person Aliton Oliveira; 22.12.2019

Технически принятый ответ неверен, учитывая вопрос ОП, а именно:

отправлять изображения, даже если интернет отключен

В принятом ответе говорится о возобновлении загрузки после начала, что подробно исправлено, но не дает правильного ответа.

Исправленный ответ: нет, вы не можете загрузить изображение в Firebase Firestore, если устройство не подключено к Интернету, загрузка завершится ошибкой и не будет автоматического перезапуска операции загрузки.

Как отмечалось ранее, вы должны быть подключены к Интернету, по крайней мере, достаточно долго, чтобы начать загрузку и получить uploadsessionuri из Firebase. После того как загрузка началась, вы можете возобновить ее, используя этот пример кода или приведенный выше код.

Как указано в документации, URI возобновления действителен в течение примерно 7 дней, но разработчик несет ответственность за то, чтобы содержимое файла не изменилось с момента начала загрузки.

person Kenneth Argo    schedule 14.09.2020