2009-10-20 12 views
8

여러분, 다운로드 대화 상자가 튀어 나오게하는 것에 관한 많은 스레드가 있다는 것을 알고 있습니다. 그러나 아직 해결 방법이 없습니다.PHP : 강제로 파일 다운로드 및 IE 다시

내 앱은 사용자의 이메일 계정으로 메일을 보내 "다른 사용자가 메시지를 보냈습니다"라고 알립니다. 이러한 메시지에는 Excel 파일에 대한 링크가있을 수 있습니다. 사용자가 GMail/Yahoo Mail/Outlook의 링크를 Excel 파일로 클릭하면 파일 저장 대화 상자가 나타납니다.

문제점 : IE에서 마우스 오른쪽 버튼을 클릭하고 "다른 이름으로 저장"을 할 때 다른 이름으로 저장 대화 상자가 나타납니다. 클릭 만하면 (많은 고객이 컴퓨터에 정통하지 않으므로 많은 사람들이 할 것입니다), IE 오류 메시지가 나타납니다 : "IE는 파일을 다운로드 할 수 없습니다 ... ...". 관련성이 있습니다. Gmail 테스트에서 모든 링크는 "target = _blank"링크 (Google에서 강제)입니다.

다른 모든 브라우저는 모든 경우에 정상적으로 작동합니다. 여기

은 (피들러를 통해 캡처) 내 헤더입니다

HTTP/1.1 200 OK 
Proxy-Connection: Keep-Alive 
Connection: Keep-Alive 
Content-Length: 15872 
Via: **** // proxy server name 
Expires: 0 
Date: Tue, 20 Oct 2009 22:41:37 GMT 
Content-Type: application/vnd.ms-excel 
Server: Apache/2.2.11 (Unix) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i mod_python/3.3.1 Python/2.5.2 SVN/1.4.6 mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0 
Cache-Control: private 
Pragma: no-cache 
Last-Modified: Tue, 20 Oct 2009 22:41:37 GMT 
Content-Disposition: attachment; filename="myFile.xls" 
Vary: Accept-Encoding 
Keep-Alive: timeout=5, max=100 

내가 IE의 일반 마우스 왼쪽 버튼으로 클릭 동작을 작업 할. 어떤 아이디어?

답변

13

IE의 버전을 확인하고 이에 따라 헤더를 설정합니다.

// assume you have a full path to file stored in $filename 
if (!is_file($filename)) { 
    die('The file appears to be invalid.'); 
} 

$filepath = str_replace('\\', '/', realpath($filename)); 
$filesize = filesize($filepath); 
$filename = substr(strrchr('/'.$filepath, '/'), 1); 
$extension = strtolower(substr(strrchr($filepath, '.'), 1)); 

// use this unless you want to find the mime type based on extension 
$mime = array('application/octet-stream'); 

header('Content-Type: '.$mime); 
header('Content-Disposition: attachment; filename="'.$filename.'"'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: '.sprintf('%d', $filesize)); 
header('Expires: 0'); 

// check for IE only headers 
if (preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']) || (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0') !== false)) { 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
} else { 
    header('Pragma: no-cache'); 
} 

$handle = fopen($filepath, 'rb'); 
fpassthru($handle); 
fclose($handle); 
+0

고마워요 SOOO. 내 목숨을 구했어! 그리고 나는 다시 정상적으로 돌아 왔습니다 :) –

+1

사후 점검 및 사전 점검은 그들이하는 일을 생각하지 않습니다. 당신은 그들을 데리고 나가야합니다. – EricLaw

+0

IE 11에 대한 지원이 추가되었으며 코드에 버그가 수정되었습니다. –

2

파일을 다운로드 할 때마다 콘텐츠 유형을 'application/octet-stream'으로 변경하십시오.

pragma 문없이 시도하십시오.

5

그냥 사용을 참조하십시오 : 모든

header('Content-Disposition: attachment'); 

있다고. (페이스 북도 마찬가지입니다.)