Content-Type을 application/octet-stream으로 설정하면 동적으로 생성된 콘텐츠를 파일로 다운로드할 수 있다는 사실은 누구나 알고 있을 것입니다. 그런 다음 Content-Disposition을 사용하여 다운로드한 파일 이름을 설정하십시오. 많은 사람들이 이것을 알고 있습니다. 기본적으로 다운로드 프로그램은 다음과 같이 작성됩니다:
<?php$filename = “document.txt”;header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print “Hello!”;?>브라우저로 열면 document.txt를 다운로드할 수 있습니다.
그러나 $filename이 UTF-8로 인코딩된 경우 일부 브라우저에서는 이를 제대로 처리할 수 없습니다. 예를 들어 위 프로그램을 약간 변경해 보겠습니다.
<?php$filename = "중국어 파일 이름.txt";header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print “Hello!”;?> 프로그램을 UTF-8 인코딩으로 저장한 후 액세스하면 IE6에서 다운로드한 파일 이름이 깨집니다. FF3에서 다운로드한 파일 이름에는 "중국어"라는 단어만 있습니다. Opera 9에서는 모든 것이 잘 작동합니다.
출력 헤더는 실제로 다음과 같습니다.
Content-Disposition: attachment; filename=중국어 파일 이름.txt 실제로 RFC2231의 정의에 따르면 다중 언어 인코딩 Content-Disposition은 다음과 같이 정의되어야 합니다
. ; 파일 이름*=”utf8 "%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"는
등호 앞에 *를 추가한다는
의미입니다.파일 이름 뒤에
filename의 값은 작은따옴표로 묶인 문자 세트(utf8), 언어(비어 있음) 및 urlencoded 파일 이름의 세 부분으로 나뉩니다.
큰따옴표를 추가하는 것이 가장 좋습니다. 그렇지 않으면 파일 이름에서 공백 뒤의 부분이 Firefox에 표시되지 않습니다. urlencode의 결과는 PHP의 urlencode 함수의 결과와 동일하지 않습니다. +, 여기서는 %20으로 바꿔야 합니다.
테스트 결과, 여러 주류 브라우저의 지원이 다음과 같은 것으로 확인되었습니다:
IE6 attachmentname="<URL 인코딩 후 UTF-8 파일 이름>"
FF3 첨부 파일 이름="UTF-8 파일 이름"
첨부 파일 이름*=”utf8”<URL 인코딩 후의 UTF-8 파일 이름>”
O9 첨부 파일 이름="UTF-8 파일 이름"
Safari3(Win)은 지원되지 않는 것 같나요? 위 방법 중 어느 것도 작동하지 않습니다
. 모든 주류 브라우저를 지원하려면 프로그램을 다음과 같이 작성해야 하는 것 같습니다.
<?php$ua = $_SERVER["HTTP_USER_AGENT"];$filename = "중국어 파일 이름.txt";$encoded_filename = urlencode( $filename);$encoded_filename = str_replace("+", "%20", $encoded_filename);header('Content-Type: application/octet-stream');if (preg_match("/MSIE/", $ua) ) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');} else if (preg_match("/Firefox/", $ua)) { header('Content-Disposition : attachment; filename*=”utf8'” . $filename . '"');} else { header('Content-Disposition: attachment; filename=”' . $filename . '"');}print 'ABC ';? >