[PHP] header를 이용해 파일다운로드시 브라우저별 UTF-8 다국어 깨짐현상 (Content-Disposition, attachment, filename, multibyte)
PHP 2014. 8. 5. 11:21UTF-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;
}
'PHP' 카테고리의 다른 글
[PHP] 에디트플러스 사용자 도구에서 PHP 문법체크 (editplus, syntax check) (5) | 2014.08.20 |
---|---|
[PHP] 프로세스를 실행시키면서 STDOUT, STDERR를 문자열 변수에 담기 (open_proc, descriptor_spec, stream_get_contents) (0) | 2014.08.19 |
[PHP] 요청한 폼데이터가 넘어오면서 일부가 없어지는 현상 (form data, input, get, post) (0) | 2014.06.20 |
[PHP] 문자열을 byte array로 변환 (string, byte array, hex) (0) | 2014.05.15 |
[PHP] cURL로 header만 요청하기 (0) | 2014.05.15 |