>  기사  >  백엔드 개발  >  파일 이름의 잘못된 문자에 대한 파일 및 솔루션을 다운로드하기 위한 PHP 구현 코드

파일 이름의 잘못된 문자에 대한 파일 및 솔루션을 다운로드하기 위한 PHP 구현 코드

高洛峰
高洛峰원래의
2016-12-23 12:44:051175검색

최근 어떤 분이 파일을 다운로드하는 방법을 물으셨습니다. PHP 방식은 다음과 같습니다.

<?php 
header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=ins.jpg"); 
readfile("imgs/test_Zoom.jpg"); 
?>

첫 번째 코드 줄은 강제 다운로드입니다.
두 번째 코드 줄은
세 번째 코드 줄은 다운로드한 콘텐츠를 파일로 읽어들이는 것입니다.
PHP 다운로드 파일 이름의 잘못된 문자를 해결하는 방법
Content-Type을 application/octet-stream으로 설정하면 동적으로 생성된 콘텐츠를 파일로 다운로드할 수 있다는 사실은 모두가 알고 있을 것입니다. 그런 다음 Content-Disposition을 사용하여 다운로드한 파일 이름을 설정하십시오. 많은 사람들이 이것을 알고 있습니다. 기본적으로 다운로드 프로그램은 다음과 같이 작성되어 있습니다.

<?php 
$filename = "document.txt"; 
header(&#39;Content-Type: application/octet-stream&#39;); 
header(&#39;Content-Disposition: attachment; filename=&#39; . $filename); 
print "Hello!"; 
?>

브라우저로 열면 document.txt를 다운로드 받을 수 있습니다.
그러나 $filename이 UTF-8로 인코딩된 경우 일부 브라우저에서는 이를 제대로 처리할 수 없습니다. 예를 들어 위 프로그램을 약간 변경해 보겠습니다.

<?php 
$filename = "中文 文件名.txt"; 
header(&#39;Content-Type: application/octet-stream&#39;); 
header(&#39;Content-Disposition: attachment; filename=&#39; . $filename); 
print "Hello!"; 
?>

프로그램을 UTF-8 인코딩으로 저장한 다음 액세스하면 IE6에서 다운로드한 파일 이름이 깨집니다. FF3에서 다운로드한 파일 이름에는 "중국어"라는 단어만 있습니다. Opera 9에서는 모든 것이 잘 작동합니다.
출력 헤더는 실제로 다음과 같습니다.
Content-Disposition: attachment; filename=English file name.txt 실제로 RFC2231의 정의에 따르면 다중 언어 인코딩 Content-Disposition은 다음과 같이 정의되어야 합니다.

Content-Disposition: attachment; filename*="utf8&#39;&#39;%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"

즉,
filename 뒤의 등호 앞에는 *가 와야 합니다.
filename의 값은 작은따옴표로 묶인 세 부분으로 나누어지며, 문자 집합(utf8), 언어 (비어 있음) 및 Urlencoded 파일 이름입니다.
큰따옴표를 추가하는 것이 가장 좋습니다. 그렇지 않으면 파일 이름에서 공백 뒤의 부분이 Firefox에 표시되지 않습니다.
urlencode의 결과는 PHP의 urlencode 함수 결과와 동일하지 않습니다. 공백은 +로 대체되며 %20으로 대체되어야 합니다.
테스트 결과 여러 주류 브라우저의 지원이 다음과 같은 것으로 확인되었습니다.
IE6 filename="12ff35ee700c1c3ff962389bc7d699f2"
FF3 attachment; filename="UTF-8 파일 이름"
attachment; filename*="utf8''356fe119669303034edc69424fa23f72"
O9 첨부 파일 ; filename="UTF- 8파일명 "
Safari3(Win)에서는 지원하지 않는 것 같은데요? 위의 방법 중 어느 것도 작동하지 않습니다
모든 주류 브라우저를 지원하려면 프로그램을 다음과 같이 작성해야 하는 것 같습니다.

<?php 
$ua = $_SERVER["HTTP_USER_AGENT"]; 
$filename = "中文 文件名.txt"; 
$encoded_filename = urlencode($filename); 
$encoded_filename = str_replace("+", "%20", $encoded_filename); 
header(&#39;Content-Type: application/octet-stream&#39;); 
if (preg_match("/MSIE/", $ua)) { 
header(&#39;Content-Disposition: attachment; filename="&#39; . $encoded_filename . &#39;"&#39;); 
} else if (preg_match("/Firefox/", $ua)) { 
header(&#39;Content-Disposition: attachment; filename*="utf8\&#39;\&#39;&#39; . $filename . &#39;"&#39;); 
} else { 
header(&#39;Content-Disposition: attachment; filename="&#39; . $filename . &#39;"&#39;); 
} 
print &#39;ABC&#39;; 
?>

파일 다운로드를 위한 PHP 구현 코드 및 잘못된 문자에 대한 솔루션에 대한 추가 관련 기사 파일명에 PHP 중국어 홈페이지를 주목해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:신입의 PHP 노트 (4)다음 기사:신입의 PHP 노트 (4)