2013-03-22 6 views
11

JavaScriptのXMLHttpRequestオブジェクトから部分コンテンツ要求を出したいと思います。私はサーバーから大きなバイナリファイルをロードしているので、html5ビデオの処理方法と同様にサーバーからストリームをストリームしたいと思っています。XMLHttpRequest 206部分コンテンツ

setRequestHeaderを使用してRangeヘッダーを設定できます。 Chromeのネットワークインスペクタは、Rangeヘッダーが正常に設定されたことを示します。しかし、Accept-Encodingヘッダーは "gzip、deflate"に設定されており、Chromeはそのヘッダーを(W3C標準から)設定することはできません。

XMLHttpRequestオブジェクトからの206部分的なコンテンツをサーバーがjavascriptからのみ返すようにする方法はありますか?

+1

サーバー側もプログラム/メンテナンスしていますか、またはクライアント側のスクリプトのみを実行していますか? – kay

+1

私はサーバー側にアクセスできますが、クライアント側を維持したいと考えています。私は、他のホストにアップロードできる静的なページを生成するものをコーディングしているので、サーバー側を混乱させる必要はありません。 – jamesshuang

答えて

8

私は206リクエストが働いていなかった理由を、私は考え出したと思います。 gzip圧縮を有効にすると、送信データをgzipできれば、範囲ヘッダーは無視されます。

私が要求していたファイルは大きなバイナリファイルで、nginxはmimetype application/octet-streamを持っていると解釈しました。これは、gzipされたMIMEタイプの1つです。ファイルの名前を.pngファイルタイプに変更した場合、image/png MIMEタイプはgzipされていないため、範囲要求は正しく機能します。

これはまた、curlでAccept-EncodingヘッダーをIDに設定すると、範囲要求が正常に動作するようにもなります。しかし、私はそのヘッダをXHRから変更することはできません。

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

12

この範囲-要求が私のために正常に動作します: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 -v -r 100-200 http://example.com/movie.mkv > /dev/null 
+2

うーん、それは奇妙です。私はまた、nginxサーバーに要求を発行しています。 Curlは-rコマンドでうまく動作します。しかし、私はブラウザでその正確なコードを試してみると、私はこの大きなオクテットストリーム(40メガバイト)に対して200応答しか得られません。それを引き起こす可能性のある手掛かりはありますか? – jamesshuang

+0

私のフィドルフィドルは機能しますか?だから、それは警告する(206)か? – kay

+1

あなたのバイブルの返答206.コードをコピーして自分のサーバーで実行し、200を返します。これに影響するサーバー変数は何ですか? – jamesshuang

関連する問題