Скачать большие файлы

У меня есть файл, представленный в виде списка фрагментов, и цель состоит в том, чтобы загрузить все фрагменты, объединить и сохранить как файл.

Требования

  1. Это должно работать для больших файлов
  2. Это должно быть кросс-браузерное решение

Что я нашел ...

  1. Use JS Array
    Yes, we can download and store all chunks in regular Javascript array.
    • It's cross-browser solution
    • Но он использует оперативную память, и если размер файла превышает размер свободной памяти, браузер просто вылетает ...
  2. FileSaver.js
    • Partly cross-browser
    • Ограниченный размер файла
  3. StreamSaver.js
    • Not cross-browser
    • Работает с большими файлами
  4. Filesystem API
    • It's Chrome sandbox filesystem api
    • Работает с большими файлами

Но я все еще не могу достичь своей цели с покрытыми требованиями ...
Если у кого-то есть опыт поиска лучшего решения, я прошу поделиться им здесь. Спасибо


person Rashad Ibrahimov    schedule 13.12.2017    source источник
comment
вам нужно dl куски в JS? если вы выплюнете это с сервера в качестве загрузки, браузер соберет все это в необработанный файл. другой вариант - загрузка фрагментов и их повторное объединение локально, вне браузера, возможно, с помощью простого кота или, что интереснее, нескольких zip-файлов в одном архиве.   -  person dandavis    schedule 14.12.2017
comment
Мне нужно присоединиться к фрагментам в браузере и сохранить как файл   -  person Rashad Ibrahimov    schedule 14.12.2017


Ответы (1)


К сожалению, здесь пока нет кроссбраузерности.

В Chrome вы можете использовать либо нестандартный API файловой системы, либо большие двоичные объекты , для которых Chrome будет использовать файловую систему, если большой двоичный объект большой..

В Firefox вы можете использовать, возможно, нестандартный IDBMutableFile. Однако он не будет работать с API загрузки, поэтому вы должны необходимо использовать window.location для отправки браузеру URL-адреса большого двоичного объекта, который браузер должен затем загрузить (может произойти не для всех расширений файлов). Вам также может потребоваться использовать постоянный параметр IDB. чтобы иметь файлы размером более ~ 2 ГБ.

В других браузерах Blob - ваш единственный реальный вариант. С другой стороны, ОС, в которой работает браузер, может использовать разбиение по страницам, что может позволить браузеру создавать большие двоичные объекты размером больше памяти.

Вариант на основе сервис-воркера, такой как StreamSaver, также может помочь (возможно, это может быть альтернатива API загрузки для Firefox), но существует (или было?) ограничение на то, как долго браузер будет ждать полного ответа, что означает, что вам, вероятно, придется загружать и хранить фрагменты где-нибудь, чтобы завершить ответ вовремя.

person Alexander O'Mara    schedule 13.12.2017
comment
Спасибо за подробный ответ. Я думаю, что тогда лучше всего для небольших файлов записывать фрагменты в массив, создавать Blob из массива и сохранять его, а для больших файлов можно использовать API файловой системы (если браузер Chrome), в противном случае показывать Не поддерживается ... Не обязательно использовать IDBMutableFile для Firefox - person Rashad Ibrahimov; 14.12.2017
comment
Я попытался создать массив кусков, он использовал ровно свободную память, а затем вылетел. Может быть, я упустил что-то из того, как Chrome использует разбиение на страницы для создания Blob, размер которого превышает размер памяти. - person Rashad Ibrahimov; 14.12.2017
comment
@RashadIbrahimov Chrome делает это автоматически (по крайней мере, должен). Может быть, каждый отдельный кусок был слишком маленьким, поэтому Chrome сохранил его в памяти? Может быть, вы получите другой результат, если будете использовать более крупные капли? К сожалению, я не думаю, что нигде задокументировано, как это работает. - person Alexander O'Mara; 14.12.2017
comment
Да, я попробовал кусок размером 1 МБ, нужно проверить больший размер. Спасибо за помощь. Надеюсь, однажды у нас будет какой-то стандартный способ работы с большими файлами :) - person Rashad Ibrahimov; 14.12.2017