2012-06-13 3 views
0

많은 사이트를 RapidShare에 업로드하여 저장합니다. 그런 다음 파일을 다운로드하려는 사용자가 액세스 할 때 API를 사용하여 RapidShare에서 다운로드 한 후 사용자에게 제공하는 스크립트가 있습니다. 이 파일을 담당하는 스크립트의 관련 코드는 다음과 같습니다.RapidShare에서 다운로드 할 때 손상된 이미지

// Stream file to user 
header('Content-Description: File Transfer'); 
header('Content-Disposition: attachment; filename=' . $result->name); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Content-Length: ' . $result->size); 

$url = 'https://' . $host . '/cgi-bin/rsapi.cgi?sub=download'; 
$url .= '&login=login'; 
$url .= '&password=mypass'; 
$url .= '&fileid=' . $result->rs_fileid; 
$url .= '&filename=' . $result->name; 

$handle = fopen($url, 'rb'); 
if(!$handle) { 
    throw new Exception('Failed to open file handle'); 
} 

while(!feof($handle)) { 
    echo fread($handle, 1024*1024); 
    ob_flush(); 
    flush(); 
} 

fclose($handle); 

이미지를 제외하고 테스트 한 모든 파일에 대해 정상적으로 작동합니다. 이미지가 다운로드되면 손상됩니다. Windows Photo Viewer는 이미지를 열 수 없으며 Photoshop과 같은 프로그램도 이미지를 열 수 없습니다.

이상한 것은, .exe를 다운로드하고 실행하면 모든 것이 정상적으로 작동한다는 것입니다. 그것은 부패한 것이 아닙니다. 내가 말할 수있는 한 이미지로만 발생합니다. 또한 .pdf로 테스트했습니다. 나는 원본 이미지 (2882 바이트)의 파일 크기를 보면

, 그것은 괴상하게하려면 다음이 스크립트를 통해 다운로드 한 이미지의 파일 크기, 그들은 같은거야. 파일 크기는 2,882 바이트입니다. 그러나 이미지는 여전히 손상되었습니다.

이 문제의 원인이 될 수있는 것은 무엇입니까? 다운로드 할 때 이진 데이터를 파일에 추가하는 것과는 다릅니다. :/

감사합니다.

편집 : 나는 이미지가 괜찮 및 손상되지 스크립트를 거치지 않고에 Rapidshare에서 바로 파일을 다운로드하는 경우, 언급하는 것을 잊었다. 따라서 여기는 잘못이있는 스크립트 여야합니다.

+0

파일의 md5sum은 어떻게 비교됩니까? 원래와 맹 글링 된 것을 보여줄 수 있습니까? – OmnipotentEntity

답변

1

answer for a similar problem을 확인, 나는 파일의 시작 부분에 약간의 통지가있을 것입니다 확실 해요!


당신이 메모리 문제가

$url = 'https://' . $host . '/cgi-bin/rsapi.cgi?sub=download'; 
$url .= '&login=login'; 
$url .= '&password=mypass'; 
$url .= '&fileid=' . $result->rs_fileid; 
$url .= '&filename=' . $result->name; 

file_put_contents($result->name, file_get_contents($url)); 
는 사용하기 쉽고, mod_xsendfile를 사용

+0

그게 다야, 고마워. 정의되지 않은 상수 인공 호흡기의 사용 - C에서 '인공 호흡기'가정 :'
공지 사항 : 시작 부분이 있었다 \ XAMPP \ htdocs를 \ '앞에'$'를 잊으 53
라인
download.php 변수의. : p –

1

코드를 단순화가의 header() 물건과 file_put에 대한 필요가 없습니다/get_contents 훨씬 세련된입니다.

+0

그래도 RapidShare에서 파일을 저장하지 않습니다. 나는 그것을 사용자에게 스트리밍하고있다. 헤더는 사용자 브라우저가 다운로드임을 인식하고 RapidShare의 파일을 청크로 에코 아웃합니다. –

+0

아, 그래! 그러므로''못생긴''fread()'대신에'echo file_get_contents ($ url);'을 사용하십시오. – powtac

+0

그것이 실제로 내가 원래하고 있었던 것입니다. 불행히도,'file_get_contents()'는 클라이언트에게 echo하기 전에 전체 파일을 메모리에로드합니다. 커다란 다운로드 (크기는 몇 GB)를 제공하고'file_get_contents() '를 사용하면 GB 파일을 메모리에로드 할 수 있습니다. 따라서 청크로 제공하는 오류가 발생하기 쉬운 방법을 사용해야하므로 메모리에있는 청크 만 있습니다. 그래도 고마워. :) –