UTF-8로 인코딩된 파일명을 매개변수로 받아 header()를 구성하여 파일다운로드를 시키려고 하는데,

브라우저별로 파일명이 깨지는 현상이 발생.

완전 브라우저를 다 까뒤집어서 테스트 해보진 않았으나, (모바일은 완전 무시)

결론적으로 말하자면 IE 혹은 기타 브라우저의 2가지 케이스가 나옴.


IE를 제외하고 테스트 해본 브라우저는 아래와 같음.

날짜: 2014-08-05

Chrome 36.0.1985.123 m

FireFox 31.0

Opera 12.17

Safari 5.1.7



<?PHP
// 브라우저별로 달라질 수 있으므로 굉장히 취약한, 그냥 예제를 위한 코드임

// GET값으로 파일명, 서버경로를 전달 받았다 치고,
$filename = urldecode($_GET['filename']);
$filepath = urldecode($_GET['filepath']);

// 파일명의 경우 IE일 때 urlencode()를 한 번 해줌
if (isIE() === true) $filename = urlencode($filename);

// header 구성
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: ".$_SERVER['HTTP_HOST']." Generated Data");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$filename.";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filepath));


// IE 인지 체크
function isIE()
{
    // IE 11
    if (stripos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0') !== false) return true;
    // IE 나머지
    if (stripos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) return true;

    return false;
}













Posted by bloodguy
,