У меня есть сервер, на котором размещены очень большие файлы:> 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-объект, содержащий весь файл, и он будет загружен в память
Что-то еще мне не хватает?Есть ли другой способ реализовать это?Примечание: расширения браузера, к сожалению, запрещены.