XmlHttpRequest с частичным телом запроса?
Я знаю, как обрабатывать фрагментированные загрузки в javascript, используя объект XmlHttpRequest. Есть ли способ выполнить частичную загрузку, используя javascript, открывая соединение, но загружая только капли данных по крупицам?
Я знаю, что чанкинг-загрузки должны быть возможны на серверах Http 1.1, и я нашел много ссылок на чанкованные загрузки с использованием различных других платформ (C# java и т. Д.), Но не нашел никаких ссылок на это в браузере с javascript.
РЕДАКТИРОВАТЬ: Вариант использования для потоковой передачи данных на сервер, а не для загрузки большого файла, что является своего рода отражением использования фрагментированного ответа для потоковой передачи данных клиенту. Это альтернатива выполнению отдельных запросов AJAX, так как порции данных, которые передаются от клиента к серверу, довольно часты (интервал< 0,5 с).
2 ответа
На сегодняшний день (ноябрь 2021 г.) я полагаю, что поддержка ЗАГРУЗКИ с использованием передачи данных по фрагментам HTTP по-прежнему в значительной степени отсутствует в браузерах.
Если вы посмотрите на столбец «Отправить ReadableStream в тексте запроса» матрицы поддержки браузера для запроса (Fetch API) , вы увидите, что в настоящее время это «Нет» для всех браузеров, кроме «Deno». Однако вы заметите флажок «Экспериментальный» рядом с колонкой. Таким образом, он доступен экспериментально в некоторых браузерах, таких как Chrome. Я бы не стал задерживать дыхание насчет того, что в ближайшее время это станет мейнстримом.
Кодирование передачи данных по частям HTTP технически не требуется для отправки данных несколькими частями за раз, я считаю, что обычная передача данных HTTP также отправляет данные только по нескольким частям за раз, но вместо этого «разделение» выполняется на уровне TCP (пожалуйста, исправьте меня, если я ошибаюсь здесь). Следовательно, оба протокола могут использоваться для потоковой загрузки файлов. WebSockets — это, конечно, еще один вариант. Основное различие в том, какой протокол выбрать, зависит от того, знаете ли вы заранее окончательную длину потока или нет.
Если вам нужно передавать потоковые данные загрузки, для которых вы заранее НЕ знаете длину (например, видео в реальном времени, звонки по видеоконференциям, сеансы удаленного рабочего стола , чаты и т . Сверху).
Если вам нужно передавать данные загрузки, для которых вы ДЕЙСТВИТЕЛЬНО знаете длину заранее (файлы, изображения, видео и т. д.), то я считаю, что ваш лучший выбор, вероятно, обычный POST или PUT с использованием Fetch API или даже старый
XmlHttpRequest
API.
Вы можете использовать FileReader API и метод слайса.
с помощью slice вы можете получить блок данных, который вы можете загрузить, затем вам нужно собрать их на стороне сервера.
вот хорошее введение о том, как обращаться с файлами в javascript http://www.html5rocks.com/en/tutorials/file/dndfiles/
вы можете взглянуть на http://caniuse.com/ для поддержки браузера