Как скачать файл из нескольких частей с нескольких серверов

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

Требования:

  • Решение должно быть с помощью java-скрипта на стороне клиента.
  • Он должен поддерживать работу с большими файлами ~ 50G и более.
  • Он должен быть быстрым и не вылетать из браузера из-за перегрузки памяти.

Прежде чем изобрести свой собственный "велосипед", я просто хочу проверить, существуют ли какие-либо существующие решения. Я не нашел достаточно хороших в поиске Google и GitHub.

Если таких решений нет, возможно, есть несколько советов относительно ограничений нового файлового API. Можно ли даже обрабатывать файлы такого большого размера?

1 ответ

Решение

Честно говоря, я серьезно сомневаюсь, что вы сможете осуществить это.

Для файлов того размера, с которыми вы работаете, вам будет гораздо проще просто попросить конечных пользователей установить клиент BitTorrent и таким образом распределить ваши загрузки.

Тем не менее, несколько контрольно-пропускных пунктов для рассмотрения:

  • Есть два API, связанных с файлами. File объект, но это только для чтения файлов, выбранных <input type="file"> или упал с помощью перетаскивания.

    То, что вам нужно, - это API-интерфейс FileSystem, но есть одна очень важная оговорка: этот API предоставляет вам виртуальную файловую систему, содержимое которой скрыто от пользователя. На практике это означает, что файлы, которые вы записываете на диск, будут храниться в неизвестном для пользователя месте (что-то вроде \Users\Me\AppData\Local\Chrome\User Data\Default\File System\000\), и пользователь должен щелкнуть специально созданную ссылку, которая запускает обычный механизм загрузки файлов в браузере (что в данном случае означает копирование файла из "виртуальной" файловой системы в папку "Загрузки" пользователя).

  • Вследствие того, что он помещен в изолированную программную среду для виртуальной файловой системы и должен скопировать файл в место назначения, у пользователя должно быть 2 * n байт. Поэтому мне нужно 100 ГБ, чтобы загрузить файл размером 50 ГБ.

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

    webkitStorageInfo.requestQuota(webkitStorageInfo.PERSISTENT, 53687091200);
    

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

  • Ты можешь написать Blobс вашей виртуальной файловой системой с FileEntry объект. Документация неполная, но я надеюсь, что вы можете писать на произвольные позиции в файле.

  • XHR явно не позволяет вам передавать данные ответа. Когда вы просите XHR дать вам ответ как Blob (новая функция), он должен буферизовать весь ответ в памяти.

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

    Это означает, что ваши отдельные части файла могут быть не больше пары мегабайт. При средней служебной нагрузке заголовка HTTP-запроса / ответа в 800 байтов - 1 кБ вы ожидаете получить дополнительные 50 МБ только в заголовках HTTP по каналу в 50 ГБ. (Я знаю, что.1% - это небольшое количество накладных расходов, это просто то, что нужно учитывать.)

Опять же, не делай этого. Используйте правильный инструмент для работы, который в этом случае является BitTorrent. Я предполагаю, что где-то есть отдельный BT-клиент, который вы можете настроить для автоматического запуска загрузки предварительно настроенного торрента. Таким образом, пользователь просто щелкнет по ссылке для скачивания, запустит EXE и будет в пути.

Другие вопросы по тегам