В настоящее время размер файла становится все больше и больше. К сожалению, это означает, что надежная загрузка этих файлов также становится намного сложнее, особенно при использовании крошечных мобильных трубок, предоставляемых жадными сетевыми операторами. Проблема в том, что большинство приложений не справляются с этой задачей, а это означает, что миллионы изображений и видео кошек ежегодно теряются из-за сетевых ошибок!
Статья помогает добиться возобновляемой загрузки файлов с помощью S3 с клиентом javascript и серверной частью сервлета.
Тус
Тус решает проблему ненадежной загрузки файлов раз и навсегда. Это новый открытый протокол возобновляемой загрузки, построенный на HTTP. Он предлагает простые, дешевые и многоразовые стеки для клиентов и серверов. Он поддерживает любой язык, любую платформу и любую сеть.
Клиент JS
Tus предоставляет различные клиентские реализации для возобновляемой загрузки файлов. Вот один из таких примеров https://github.com/tus/tus-js-client
Клиент tus отправляет файл по частям, ему просто требуется файловый объект.
Обратите внимание, что переменная file может быть либо объектом javascript, либо файловым потоком в среде nodeJS. Один и тот же код работает для обеих сред.
S3 как серверная часть хранилища
Tus заботится о внешнем интерфейсе и отправляет файл фрагментом. Но должна быть соответствующая задняя часть, чтобы справиться с этим.
Благодаря своей простой системе хранения (S3) Amazon Web Services создала одного из основных поставщиков облачных хранилищ для приложений, от небольших побочных проектов до корпоративных систем.
Многостраничные загрузки S3
S3 Multipart upload помогает хранить файл по частям на стороне сервера. Это позволяет нам загружать единый объект как набор частей. Каждая часть представляет собой непрерывную часть данных объекта. Эти части объекта мы можем выгружать самостоятельно и в любом порядке. Если передача какой-либо части не удалась, мы можем повторно передать эту часть, не затрагивая другие части. После того, как все части вашего объекта загружены, Amazon S3 собирает эти части и создает объект. Он ограничен одной частью размером 5 МБ, за исключением последней части файла.
Выполнение
Вы можете увидеть реализацию сервлета здесь https://github.com/sponnusamy/tus_servlet
Он включает в себя три этапа
- Начать загрузку файла
- Загрузите файл кусками по 5 МБ.
- Завершить загрузку файла
Также есть возможность прервать загрузку.
Начать загрузку файла
Когда вы отправляете запрос на инициирование составной загрузки, Amazon S3 возвращает ответ с идентификатором загрузки, который является уникальным идентификатором для вашей составной загрузки. В него включены все API, такие как загрузка частей, список частей, завершение загрузки или прерывание загрузки.
Загрузить / возобновить
После того, как вы инициируете составную загрузку, серверная часть может начать чтение содержимого файла с клиента и загрузку в S3. Можно возобновить загрузку файла с идентификатором загрузки, если она приостановлена посередине. Клиент Tus возобновит загрузку файла, если она приостановлена, в противном случае она начнется с самого начала. Бэкэнд должен предоставить обработчик HEAD для конечной точки и сохранить смещение и метаданные в заголовках ответов. Смещение можно рассчитать с помощью API ListParts S3, как показано ниже.
Затем клиент Tus отправит поток файлов в запросе PATCH, а серверная часть получит его для загрузки на S3 кусками.
Полная загрузка файла
Важно завершить загрузку файла, чтобы отметить, что загрузка завершена. Когда вы завершаете загрузку из нескольких частей, Amazon S3 создает объект, объединяя части в порядке возрастания на основе номера детали.
Прервать загрузку файла
Вы можете прервать загрузку файла, когда она приостановлена.
Полный исходный код доступен здесь https://github.com/sponnusamy/tus_servlet