2013-03-22 73 views
11

我想從JavaScript中的XMLHttpRequest對象發出部分內容請求。我正在從服務器加載一個大的二進制文件,我寧願將它從服務器上流式傳輸,類似於如何處理html5視頻。XMLHttpRequest 206部分內容

我可以使用setRequestHeader設置Range標題。 Chrome中的網絡檢查器顯示Range標頭已成功設置。但是,Accept-Encoding標頭設置爲「gzip,deflate」,Chrome不會讓我設置該標頭(來自W3C標準)。

有什麼辦法來強制服務器響應從XMLHttpRequest對象的206部分內容只從JavaScript?

+1

您是否也編程/維護服務器端,還是僅執行客戶端腳本? – kay 2013-03-22 02:05:59

+1

雖然我有權訪問服務器端,但我寧願保留它在客戶端。我編碼的東西,生成一個靜態頁面,可以上傳到其他主機,所以我寧願不必亂搞服務器端... – jamesshuang 2013-03-22 02:34:16

回答

8

我想我弄明白了爲什麼206請求不起作用。在啓用gzip壓縮的情況下,如果可以對傳出數據進行gzip壓縮,範圍標題將被忽略。

我正在請求的文件是一個大的二進制文件,nginx解釋爲具有mimetype應用程序/八位字節流。這是得到gzip的mimetypes之一。如果我將文件重命名爲.png文件類型,則image/png mimetype不會被壓縮,因此範圍請求可以正常工作。

這也是爲什麼將Accept-Encoding標頭設置爲curl爲標識還允許範圍請求正常工作的原因。但是,我無法從XHR更改該標題。

解決方案:更改服務器上的mimetype表!

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來測試它:

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

嗯,這是離奇的。我也向nginx服務器發出請求。使用-r命令,Curl可以正常工作。但是,當我在瀏覽器中嘗試使用精確的代碼時,對於這個大型八位字節流(40 MB),我只得到200個響應。任何線索可能導致什麼? – jamesshuang 2013-03-22 02:39:54

+0

我的小提琴小提琴是否工作?那麼它會提醒(206)嗎? – kay 2013-03-22 02:42:17

+1

你的小提琴響應206.複製代碼並在我自己的服務器上運行,得到200.什麼樣的服務器變量可以影響這個? – jamesshuang 2013-03-22 02:47:54