2011-01-22 2 views
1

PHP에서 URL을 다운로드하는 데 사용할 수있는 여러 가지 옵션이 있지만 막혀 있습니다.Content-Range가 PHP로 전송 될 때 URL 데이터 검색

내가 아는 모든 것을 살펴 봤지만 부분 콘텐츠 헤더에는 관심을 보이지 않는 것 같습니다.

나는 다음과 같은 헤더가 제공하는 URL 검색하기 위해 노력하고있어 : HTTP/1.1 206 일부 내용 콘텐츠 범위 : 바이트 0-100000/631,723

당신이 그것을 볼 수 있듯이 요리 출력 파일에서을 100,000 바이트 청크.

PHP에서 file_get_contents, fopen 또는 심지어 cURL과 같은 메서드를 사용할 때 문제가되는 것은 처음 100,000 바이트를받은 후 계속해서 문제가 발생하지 않는다는 것입니다.

최종 결과는 100,000 바이트 파일입니다.

내가 필요한 것은 위의 예제에서 모든 631,723 바이트의 모든 데이터를 가져 오기 위해 PHP 스크립트를 얻는 것입니다.

어떻게하면됩니까?

예를 들면 : 당신이 (206) 부분 컨텐츠 반응을 얻고있는 경우

답변

0

는, 당신은 해야 귀하의 요청에 원하는 범위를 나타내는 Range 헤더 필드를 포함했다

GET /2390/2253727548_a413c88ab3_s.jpg HTTP/1.1 
Host: farm3.static.flickr.com 
Range: bytes=0-999 

또는 프록시 어딘가 범위의 일련의 요청을 깨는 것은 해상도로

편집

을 요청 거기, 당신은을 사용하여 일련의 요청을 전송 시도 할 수도 있습니다 범위를 가져온 다음 각 응답을받을 때 함께 묶습니다.

EDIT 2

요청을 위반하여 일련의 응답을받는 프록시가있는 경우 첫 번째 처리 만하고있는 것일 수 있습니다. CURLOPT_WRITEFUNCTION을 사용하여 각 데이터 응답이 수신 될 때마다 호출되는 콜백을 등록 할 수 있으며 여러 청크와 함께 다시 스티칭을 관리 할 수 ​​있습니다.

+0

file_get_contents 등은 보내지 않습니까? 내 코드의 아무 곳에 나 명시 적으로 범위 헤더가 없습니다. 서버가 헤더에 관계없이이 헤더를 제외하도록이 방법으로 설정되어 있다고 생각합니다. – Edward

+0

요청이 범위를 지정하지 않을 때 서버가이를 설정하면 RFC 2616 –

+0

에 위배됩니다.이 방법을 사용하지 않기를 바랬지 만, 강제로 처리 할 것으로 보입니다. 감사합니다 – Edward

0

HTTP/1.0 (콘텐츠 범위 요청 (및 기타 캐싱 및 프록시 tohuwabohu)을 정의하지 않음)으로 보내보십시오. 따라서 전체 파일을 확실히받을 수 있습니다.

file_get_contents를 사용하려면 stream_context_create()을 통해 protocol_version 매개 변수를 설정하십시오.

+0

제안에 감사드립니다.file_get_contents를 사용하고 cURL과 CURLOPT_HTTP_VERSION 옵션을 사용하면됩니다. 두 가지 모두 여전히 콘텐츠 범위를 다시 얻습니다. 나는 내가 말했듯이 서버가 관계없이 그것을 처리하도록 설정되어 있다고 생각한다. 범위 전송을 시도했지만 올바르지 않은 범위를 다시 전송합니다. 기본적으로 IE는 100,000 바이트 단위로 요리합니다. 바이트 수를 요청하면 125000-160000은 100001-200001을 전송합니다! – Edward

+0

@Edward : 아주 조잡한 구현처럼 들립니다. 그러나 분명히, 당신은 그때 수동 경로를 가야 할 것입니다 .. – mario

+0

너무 이전 버전과의 호환성을 위해. –

관련 문제