2013-03-22 2 views
11

자바 스크립트에서 XMLHttpRequest 객체의 부분 콘텐츠 요청을 보내고 싶습니다. 서버에서 큰 바이너리 파일을로드하는 중이고 html5 비디오 처리 방식과 비슷한 서버에서 스트리밍하는 것이 좋습니다.XMLHttpRequest 206 부분 콘텐츠

setRequestHeader를 사용하여 Range 헤더를 설정할 수 있습니다. Chrome의 네트워크 속성은 Range 헤더가 성공적으로 설정되었음을 보여줍니다. 그러나 Accept-Encoding 헤더는 "gzip, deflate"로 설정되어 있으며 Chrome에서 해당 헤더를 설정하지 못하게됩니다 (W3C 표준).

서버가 자바 스크립트의 XMLHttpRequest 객체의 206 부분 콘텐츠로 응답하도록하는 방법이 있습니까?

+1

서버 쪽도 프로그래밍/유지 관리합니까 아니면 클라이언트 측 스크립팅 만 수행합니까? – kay

+1

나는 서버 측에 액세스 할 수 있지만 클라이언트 쪽을 유지하는 것을 선호합니다. 다른 호스트에 업로드 할 수있는 정적 페이지를 생성하는 코드를 작성 중이므로 서버 측을 엉망으로 만들 필요가 없습니다. – jamesshuang

답변

8

206 요청이 작동하지 않는 이유를 알았습니다. gzip 압축을 사용하면 보내는 데이터를 gzip으로 압축 할 수 있으면 범위 헤더가 무시됩니다.

내가 요청한 파일은 nginx가 mimetype application/octet-stream을 갖는 것으로 해석되는 큰 바이너리 파일이었습니다. 이것은 gzip 된 MIME 형식 중 하나입니다. 파일의 이름을 .png 파일 유형으로 변경하면 이미지/png MIME 유형이 gzipped되지 않으므로 범위 요청이 올바르게 작동합니다.

이렇게하면 curl을 사용하여 Accept-Encoding 헤더를 ID로 설정하면 범위 요청이 올바르게 작동 할 수도 있습니다. 그러나 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 -v -r 100-200 http://example.com/movie.mkv > /dev/null 
+2

흠, 기괴합니다. 나는 또한 nginx 서버에 요청을 발행하고있다. Curl은 -r 명령으로 잘 작동합니다. 그러나 브라우저에서 정확한 코드를 사용하려고하면이 큰 옥텟 스트림 (40MB)에 대해 200 개의 응답 만받습니다. 그 원인이 될 수있는 단서가 있습니까? – jamesshuang

+0

바이올린 바이올린은 작동합니까? 그래서, 경고합니까 (206)? – kay

+1

당신의 바이올린 응답 206. 코드를 복사하고 내 서버에서 실행하면 200이됩니다. 어떤 서버 변수가이 문제에 영향을 미칠 수 있습니까? – jamesshuang

관련 문제