첨부파일 다운로드시 깨지는 현상 정보
첨부파일 다운로드시 깨지는 현상관련링크
본문
출처: http://dryad.kr/bbs/board.php?bo_table=rboard01&wr_id=214
< 환경 >
* 우분투 10.04 서버
* PHP 판번호: PHP Version 5.3.2-1ubuntu4.7
* 서버 사양: P4 1.7GHz, 512MB RAM
* Mod-security 모듈 작동중이고, 기타 외산 오프소스 방화벽 OS 별도 가동 중...
다름 아니라, 위의 환경에서, 게시판에 첨부한 파일을 클릭하여 내려받기 하면, 파일이 깨져있습니다. (혹은 정상적으로 열리지 않음. 예를 들면, 그림파일들, zip, doc 등등)
이 문제로, /bbs/download.php 에서,
아래 부분을 모두 주석 처리하고,
----------------------------------------------------------
if(preg_match("/msie/i", $_SERVER[HTTP_USER_AGENT]) && preg_match("/5\.5/", $_SERVER[HTTP_USER_AGENT])) {
header("content-type: doesn/matter");
header("content-length: ".filesize("$filepath"));
header("content-disposition: attachment; filename=\"$original\"");
header("content-transfer-encoding: binary");
} else {
header("content-type: file/unknown");
header("content-length: ".filesize("$filepath"));
header("content-disposition: attachment; filename=\"$original\"");
header("content-description: php generated data");
}
header("pragma: no-cache");
header("expires: 0");
flush();
---------------------------------------
아래의 코드로 대체할 때, 정상적으로 파일이 열리게 됩니다.
* 아래 코드 출처 - http://kr2.php.net/manual/en/function.header.php 참조 (2011년 1월 31일자 User Contributed Notes)
// Must be fresh start
if( headers_sent() )
die('Headers Already Sent');
// Required for some browsers
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
// Parse Info / Get Extension
$fsize = filesize($filepath);
$path_parts = pathinfo($filepath);
$ext = strtolower($path_parts["extension"]);
// Determine Content Type
switch ($ext)
{
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".$original."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
ob_clean();
flush();
< 환경 >
* 우분투 10.04 서버
* PHP 판번호: PHP Version 5.3.2-1ubuntu4.7
* 서버 사양: P4 1.7GHz, 512MB RAM
* Mod-security 모듈 작동중이고, 기타 외산 오프소스 방화벽 OS 별도 가동 중...
다름 아니라, 위의 환경에서, 게시판에 첨부한 파일을 클릭하여 내려받기 하면, 파일이 깨져있습니다. (혹은 정상적으로 열리지 않음. 예를 들면, 그림파일들, zip, doc 등등)
이 문제로, /bbs/download.php 에서,
아래 부분을 모두 주석 처리하고,
----------------------------------------------------------
if(preg_match("/msie/i", $_SERVER[HTTP_USER_AGENT]) && preg_match("/5\.5/", $_SERVER[HTTP_USER_AGENT])) {
header("content-type: doesn/matter");
header("content-length: ".filesize("$filepath"));
header("content-disposition: attachment; filename=\"$original\"");
header("content-transfer-encoding: binary");
} else {
header("content-type: file/unknown");
header("content-length: ".filesize("$filepath"));
header("content-disposition: attachment; filename=\"$original\"");
header("content-description: php generated data");
}
header("pragma: no-cache");
header("expires: 0");
flush();
---------------------------------------
아래의 코드로 대체할 때, 정상적으로 파일이 열리게 됩니다.
* 아래 코드 출처 - http://kr2.php.net/manual/en/function.header.php 참조 (2011년 1월 31일자 User Contributed Notes)
// Must be fresh start
if( headers_sent() )
die('Headers Already Sent');
// Required for some browsers
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
// Parse Info / Get Extension
$fsize = filesize($filepath);
$path_parts = pathinfo($filepath);
$ext = strtolower($path_parts["extension"]);
// Determine Content Type
switch ($ext)
{
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".$original."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
ob_clean();
flush();
추천
0
0
댓글 6개
좋은 정보 감사합니다.
정말 감사드립니다.. 다운로드시 파일명이 특수문자로 바뀌게 나와서... 여기저기 찾아보다가 덕분에
해결했습니다.. 감사감사^_^
해결했습니다.. 감사감사^_^
케이스를 모든 화일로 하고싶습니다. 아니면 특정한것 제외..
완전 대박~ 한참 찾아 헤맸는데 감사합니다,
정말 어렵게 찾았네요^^
감사합니다.
감사합니다.
워드 파일 다운로드하면 빈 페이지라 원인을 못 찾았는데
시원하게 해결되었네요
감사합니다
시원하게 해결되었네요
감사합니다