[코드보완요청] /bbs/download.php 에서 다운로드시 파일 깨짐 (우분투 10.04 서버) > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

[코드보완요청] /bbs/download.php 에서 다운로드시 파일 깨짐 (우분투 10.04 서버) 정보

[코드보완요청] /bbs/download.php 에서 다운로드시 파일 깨짐 (우분투 10.04 서버)

본문

안녕하세요.

항상, 그누보드에 감사드립니다.

< 환경 >

* 우분투 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=\"".basename($filepath)."\";" );
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".$fsize);
    ob_clean();
    flush();
-----------------------------------------------------

관리자님, 참고해 주세요.

감사합니다.

PS) 코드보완, 혹은 버그신고란, 혹은 담당 이메일주소를 찾을 수 없어, 여기에 올립니다. 양해 바랍니다.

댓글 전체

감사합니다..
저도 같은 현상으로 파일이 깨져서 다운로드가 제대로 안되었는데 덕분에 정말 잘 사용하게 되었습니다.
이것때문에 일주일동안 고생했는데 감사합니다 ^^

올려주신 소스중에 중간에
header("Content-Disposition: attachment; filename=\"".basename($filepath)."\";" );
이부분을 사용하게되면 파일명이 바뀐것으로 download가 되게 되네요..
header("Content-Disposition: attachment; filename=\"".$original."\";" );
이렇게 저는 수정해서 사용했습니다.
이렇게하면 upload 했을때의 파일명으로 다운받을 수 있기 때문에 요 부분만 제가 수정해서 사용하고 있습니다.
넘 감사합니다.. ㅠ.ㅠ 정말 고생 많이 했거든요.. 감사합니다 ^^
전체 66,558 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT