Частичное содержание XMLHttpRequest 206

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

Я могу использовать setRequestHeader для установки заголовка Range. Инспектор сети в Chrome показывает, что заголовок Range успешно установлен. Однако заголовок Accept-Encoding имеет значение "gzip, deflate", и Chrome не позволит мне установить этот заголовок (из стандартов W3C).

Есть ли способ заставить сервер отвечать частичным содержимым 206 из объекта XMLHttpRequest только из javascript?

Ответ 1

Думаю, я понял, почему запрос 206 не работал. С включенным сжатием gzip заголовок диапазона игнорируется, если исходящие данные могут быть сжаты.

Файл, который я запрашивал, был большим двоичным файлом, который nginx интерпретировал как имеющее приложение mimetype/октет-поток. Это один из mimetypes, который получает gzip. Если я переименовал файл в файл типа .png, то mimetype изображения /png не будет gzipped, и, следовательно, запрос диапазона будет работать правильно.

Именно поэтому настройка заголовка Accept-Encoding с завивком на идентификатор также позволяет работать с запросом диапазона. Однако я не могу изменить этот заголовок из XHR.

Решение: измените таблицу mimetype на сервере!

Ответ 2

Этот запрос диапазона отлично подходит для меня: http://jsfiddle.net/QFdU4/

var xhr = new XMLHttpRequest;

xhr.onreadystatechange = function () {
  if (xhr.readyState != 4) {
    return;
  }
  alert(xhr.status);
};

xhr.open('GET', 'http://fiddle.jshell.net/img/logo.png', true);
xhr.setRequestHeader('Range', 'bytes=100-200'); // the bytes (incl.) you request
xhr.send(null);

Однако вы должны убедиться, что сервер разрешает запросы диапазона. Вы можете проверить его с помощью curl:

$ curl -v -r 100-200 http://example.com/movie.mkv > /dev/null