16

javascript で XMLHttpRequest オブジェクトから部分的なコンテンツ リクエストを発行したいと考えています。サーバーから大きなバイナリ ファイルを読み込んでいますが、html5 ビデオの処理方法と同様にサーバーからストリーミングしたいと考えています。

setRequestHeader を使用して Range ヘッダーを設定できます。Chrome の Network インスペクターは、R​​ange ヘッダーが正常に設定されたことを示しています。ただし、Accept-Encoding ヘッダーは「gzip,deflate」に設定されており、Chrome ではそのヘッダーを設定できません (W3C 標準から)。

javascript からのみ XMLHttpRequest オブジェクトからの 206 部分コンテンツでサーバーに応答させる方法はありますか?

4

2 に答える 2

17

この範囲要求は私にとってはうまく機能します: 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
于 2013-03-22T02:24:22.303 に答える
12

206 リクエストが機能しない理由が分かった気がします。gzip 圧縮を有効にすると、送信データを gzip できる場合、範囲ヘッダーは無視されます。

私が要求していたファイルは、nginx がアプリケーション/オクテット ストリームの mimetype を持つと解釈した大きなバイナリ ファイルでした。これは、gzip される MIME タイプの 1 つです。ファイルの名前を .png ファイル タイプに変更した場合、image/png MIME タイプは gzip されないため、範囲リクエストは正しく機能します。

これが、curl を使用して Accept-Encoding ヘッダーを ID に設定すると、範囲リクエストが正常に機能する理由でもあります。ただし、そのヘッダーを XHR から変更することはできません。

解決策: サーバーの MIME タイプ テーブルを変更してください。

于 2013-03-23T22:15:38.917 に答える