2014-09-18 5 views
0

IIS 서버에 .dmg 파일이 있습니다. 직접 다운로드 할 때 파일이 잘 열리지 만 내가 그렇게PHP에서 .dmg 파일을 검색 할 때 '디스크 이미지가 인식되지 않음'이 표시됩니다.

$mime_types['dmg'] ='application/x-apple-diskimage'; 
$filename = getfile($_GET['dc']);   
$fakename = fakefilename($_GET['dc']); 
$extension = fileexten($filename); 
    if(($filename!= false)&&($fakename!=false&& @fopen($filename,'r')==true)){ 
    $mime = contenttype($extension); 
    set_time_limit(0); 
    header('Pragma: public'); 
    header('Expires: 0'); 
    header("Content-Type:".$mime); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Content-Disposition: attachment;filename='.$fakename.'.'.$extension); 
    header("Content-Transfer-Encoding: binary"); 
     if (ob_get_length() > 0) { 
     ob_end_clean(); 
     } 
    flush(); 
    @readfile($filename); 
    } 

처럼 PHP를 통해 파일을 제공 할 때 나는 또한 .dmg를 설정하려고했습니다 '인식되지 디스크 이미지를'말하는 맥에 오류가 application/octet-stream하지만 여전히 같은 문제가 발생합니다.

+0

readfile 전에 플러시 하시겠습니까? 또한 ob_flash도 사용해야 할 수도 있습니다. – Dexa

답변

1

내 생각에 컨텐트 유형이 올바르게 설정되지 않았거나 컨텐트 길이가 잘못 설정된 경우입니다. $mime = contenttype($extension);이 올바른 콘텐츠 형식을 반환하는지 확인하십시오.

웹 디버깅 프록시 도구 (Fiddler 또는 Charles)를 사용하여 디버그하고 전체 응답 헤더를 게시하는 것은 PHP 스크립트를 통해 파일에 액세스 할 때 직접 &에 액세스 할 때 유용합니다. (아래의 의견에 따라)

UPDATE :

스크립트는 응답에 발송되고 있었다 파일의 끝 부분에 추가로 줄 바꿈을했다.

+0

'HTTP/1.1 200 OK 캐시 제어 :-검증해야합니다, 사후 검사 = 0 = 0 에서 Pragma을 미리 확인 : 공공 전송 - 인코딩 : 콘텐츠 형식을 청크 : 응용 프로그램/X-사과 디스크 이미지 을 만료일 : 0 서버 : Microsoft-IIS/8.5 X-Powered-By : PHP/5.5.11 콘텐츠 처리 : 첨부 파일 이름 : AcrobatXPro.dmg 콘텐츠 전송 인코딩 : 이진 X-Powered-By : ASP.NET 날짜 : 2014 년 9 월 18 일 15시 50 분 06 초 그리니치 표준시는 PHP를 통해 다운로드 할 때 얻을 수있는 헤더입니다 – Matt

+0

또한 직접 다운로드 할 헤더를 게시하십시오. 또한, 두 파일 (직접 및 PHP에서 얻은 파일)의'md5 checksum' (PHP의 md5_file 참조)을 사용하여 두 경우 모두 실제로 동일한 내용을 얻도록하십시오 (예 : PHP 스크립트에 의해 출력에 주입 됨). – dcro

+0

"Accept-Ranges :"바이트 "Content-Length"를 직접 다운로드하려면 497415912 "Content-Type :"application/x-apple-diskimage "Etag :"80603b1eb3fecb1 : 0 "서버 :"Microsoft-IIS/8.5 "그리고 PHP 스크립트가 올바른 추가 데이터를 주입하고 있습니다. md5 체크섬이 일치하지 않습니다 – Matt