본문 바로가기
프로그램개발/ServerSide(PHP,Node.js)

utf-8 환경에서 php를 이용한 파일다운로드시 파일명 깨짐현상

by 크레도스 2017. 8. 1.

출처 : https://phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_function&wr_id=451792&page=1


*질문

centos 6.x를 utf-8환경에서 사용중입니다. 
apache 설정파일에 AddDefaultCharset UTF-8을 추가하였습니다. 
모든 php파일은 utf-8형식으로 되어 있습니다. 

'가나다라.txt' 파일은 서버에서 직접만든 파일로 내용은 물론 파일명도 utf-8입니다. 

에디트플러스에서 그냥 보면 파일명이 깨저보이고 고급옵션에서 'utf-8 파일명사용'을 체크해야 정상으로 보이는 그런 파일입니다. 

이파일을 php를 통해 다운로드시키고자 아래의 코드를 만들었습니다. 

$file = "./가나다라.txt"; 
header("Content-Type: text/plain; charset=utf-8"); 
header("Content-Disposition: attachment; filename=\"".basename($file)."\""); 
header("Content-Length: ".filesize($file)); 
readfile($file); 

크롬, 파이어폭스, 오페라에선 잘되는데 IE에서는 파일명이 깨저서 다운로드 됩니다. 
물론 iconv를 사용하여 파일명을 변환하면 되지만 utf-8파일명을 있는 그대로 사용할수는 없는지요?


* 답변

  • // 브라우저별 파일이름 깨지는거 방지로 추가함
    $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
    if (preg_match('/msie/', $userAgent)) {  // 익스일 경우          
    $FILE_NM = iconv("utf-8","euc-kr",  $FILE_NM);
    }        



    //PHP 소스
    $file = $_SERVER[DOCUMENT_ROOT].$FILE_PATH; //파일의 절대 경로

    header("Content-type: application/x-unkown");
    header("Content-Disposition: attachment; filename=$FILE_NM");
    header('Content-length: '.filesize($file));
    header("Content-Transfer-Encoding: binary");
    header("Pragma: no-cache"); 
    header("Expires: 0");
    readfile($file);