Обработка больших файлов загрузки с помощью JavaScript - PullRequest
0 голосов
/ 11 июня 2019

У меня есть сервер, на котором размещены очень большие файлы:> 50 ГБ.До сих пор эти файлы просто скачивались через браузер нормально.(<a href="...">)
Проблема в том, что они часто загружаются через медленные / ненадежные соединения, и если загрузка не удалась, они должны начинаться с нуля.
В качестве решения этой проблемы я хочу сделатьальтернативный загрузчик в браузере, где каждый загруженный кусок сохраняется во временное хранилище с javascript, что позволяет возобновить загрузку в случае сбоя.

Хороший пример использования чего-то подобного - mega.nz .Загрузки обрабатываются с помощью javascript, и когда весь файл загружается во временную папку, браузер отображает классический диалог загрузки файлов, который фактически ссылается на URL-адрес BLOB-объекта.Я придумала несколько решений, но сложная часть заключается в том, что мне нужно поддерживать FF, Chrome и IE 11 +.

Solution # 1) fetch + Fileystem API + HTTP Rangeзаголовок
Я использую fetch() и передаю результат в FileWriter.Если в любой момент загрузка не удалась, я могу проверить, сколько байтов было записано в файл, и использовать заголовок Range в следующем fetch().По завершении загрузки я могу получить URL-адрес, подобный filesystem:http://some-url/file, который я могу назначить в качестве атрибута a тега href с установленным параметром download.Я отправляю событие click(), и файл загружается практически мгновенно.Весь файл не загружается в память, поэтому он может работать с очень большими файлами, но этот метод работает только в Chrome.Я знаю, что для API FileSystem есть polyfill, который использует indexedDB, но когда мне нужно сгенерировать URL, он выдаст мне BLOB-объект, который загружается в память.Также записи загружают все значение в память, добавляют к нему, а затем записывают его обратно.(Едва эффективный, и не будет работать с большими файлами)

Solution # 2) Сервисные работники + IndexedDB
С помощью сервисного работника я могу перехватить событие fetch,и отправить обратно любые данные, которые я хочу.Я могу использовать это для реализации сохранения файлов в IndexedDB и их обслуживания оттуда порциями, без загрузки всей вещи в память, если я сделаю ReadableStream с правильной логикой.

Solution #3) Flash (Actionscript)
Мега, кажется, использует какой-то загрузчик на основе Flash в качестве запасного варианта для старых браузеров, пока не рассматривал его, но, возможно, это жизнеспособное решение для IE.

Решение № 4) ActiveX
Снова возможное решение для IE.Можно ли использовать ActiveX для потоковой передачи данных прямо в файловую систему без загрузки их в память?

Пока что мне не хватает поддержки IE и версий FF, где работники службы не включены, например Firefox ESR.В IE есть IndexedDB, но для загрузки данных мне нужно создать один BLOB-объект, содержащий весь файл, и он будет загружен в память

Что-то еще мне не хватает?Есть ли другой способ реализовать это?Примечание: расширения браузера, к сожалению, запрещены.

1 Ответ

0 голосов
/ 11 июня 2019

Я бы порекомендовал использовать Background Fetch API с оговоркой, что в настоящее время он поддерживается только в Chrome 74+ (и соответствующих выпусках предварительного просмотра Edge). Он разработан для вашего случая использования.

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

...