Как отправить большой файл(аудио или видео) на сервер с android приложения правильно?
Допустим есть сервер на php и клиент на Java. Мне нужно, чтобы пользователь мог отправить файл размером свыше 50 мб на сервер через service, но таким образом, что если телефон выключится или интернет будет временно недоступен, то загрузка приостановится и начнется с того же самого места. Плюс вместе с этим файлом отправится описание и все вместе сохранится в базе данных MySQL. То есть мне нужно отправку файлов на сервер реализовать так же, как реализовано в Instagram или YouTube. Но я не когда раньше так не делал и не знаю с чего начать и что для этого нужно.
Простая схема:
- Перед загрузкой делаем запрос на сервер, отправляем туда хэш сумму и размер файла (для дальнейшей проверки)
- В ответ получаем идентификатор, с которым будем выполнять загрузку
- Делим файл на желаемое кол-во частей
- Отправляем поочередно полученные части с указанием сдвига и длины "кусочка" файла
- На сервере эти кусочки можно записать во временный файл
- После загрузки всех частей, отправляем на сервер завершающий запрос
- На сервере делаем проверку хэш суммы и размера файла
- В ответ сообщаем о результате загрузки
- Для восстановления процесса загрузки достаточно знать кол-во загруженных частей на текущий момент (узнаем у сервера или сохраняем локально)
- Загрузку можно делать через обычное TCP подключение, в таком случае размер одной части можно сделать очень маленьким (4-8КБ), на каждую отправленную часть сервер должен отвечать пакетом с подтверждением получения.
P.S. Не уверен в эффективности такого решения, но я уже несколько раз применял такую схему в рабочих приложениях.
Взрослые разработчики используют заголовки. Никто не ограничивает вас в использовании заголовка Content-Range в запросе.
Прошу прощения, позволю себе использовать синтаксис httpie.
POST "/upload/"
Content-Type:[MEDIA_TYPE]
Content-MD5:[BASE64_MD5_FILE]
Content-Range: bytes [FROM_BYTES]-[TO_BYTES]/[FILE_SIZE]
file@file.ext
Один эндпойнт. Без бойлерплейта из трех разных запросов.
bytes 0-? : создаёт файл, рекомендовал бы создавать с именем md5;
bytes ? -? : запись в файл
bytes ? - total_size : запись в файл, проверка контрольной суммы, переименование.
Реализуете следующие api
/api/continuousupload - принимает multipart/form-data
/api/continuousuploadcreate - создает длительную закачку на сервере
/api/continuousuploadinfo - отдает информацию по чанку
На клиенте
1. /api/continuousuploadcreate - создаете закачку сервер возвращает id
2. бьете файл на чанки пусть по 2 мегабайта отправляете через /api/continuousupload
3. сервер в мета файле записывает позицию указатель и записывает поток байт принятый от /api/continuousupload
4. При обрыве связи сервер отдает точно записанные данные через /api/continuousuploadinfo клиент передает чанк начиная с позиции
Соответственно и на сервере и на клиенте нужно вычислять контрольные суммы при передаче.
upd: а, ну ясно. Еще месяц назад вы задавали вопрос о том, как обновить версию языка. Эта приставочка ваше чсв повышает? Или это эффект Даннинга-Крюгера?
Alex Wells, Месяц назад, я задавал вопрос о странном поведении студии. При обновлении.
А картинка хорошая. Несколько раз в день испытываю такие чувства.