> 백엔드 개발 > PHP 문제 > PHP 파일 다운로드 시 파일명이 깨졌을 경우 대처 방법

PHP 파일 다운로드 시 파일명이 깨졌을 경우 대처 방법

藏色散人
풀어 주다: 2023-03-17 08:06:01
원래의
2192명이 탐색했습니다.

PHP 파일을 다운로드할 때 잘못된 파일 이름에 대한 해결 방법: 1. "Content-Type"을 "application/octet-stream"으로 설정합니다. 2. "header('Content-Disposition: attachment; filename*="utf8'''을 설정합니다. . $파일이름 . '"');} else {헤더(...)".

PHP 파일 다운로드 시 파일명이 깨졌을 경우 대처 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, PHP 버전 8.1, Dell G3 컴퓨터.

PHP 파일 다운로드 파일 이름이 깨졌을 경우 어떻게 해야 하나요?

PHP 다운로드 파일 이름이 깨졌습니다

Content-Type을 application/octet-stream으로 설정하면 동적으로 생성된 콘텐츠를 파일로 다운로드할 수 있습니다. . 나는 모든 도시를 믿습니다. 그런 다음 Content-Disposition을 사용하여 다운로드한 파일 이름을 설정하십시오. 많은 사람들이 이것을 알고 있습니다. 기본적으로 다운로드 프로그램은 다음과 같이 작성되어 있습니다.

코드는 다음과 같습니다.

$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
로그인 후 복사

브라우저로 연 후 document.txt를 다운로드할 수 있습니다.

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

코드는 다음과 같습니다.

$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은 다음과 같이 정의되어야 합니다.

코드는 다음과 같습니다:

Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"
로그인 후 복사

즉:

파일 이름 뒤의 등호 앞에 *

파일 이름의 값은 작은 따옴표로 묶인 세 부분으로 나누어져 있으며 문자 집합(utf8), 언어 (비어 있음) 및 Urlencoded 파일 이름입니다.

큰따옴표를 추가하는 것이 가장 좋습니다. 그렇지 않으면 파일 이름에서 공백 뒤의 부분이 Firefox에 표시되지 않습니다.

urlencode의 결과는 PHP의 urlencode 함수의 결과와 동일하지 않습니다. PHP의 urlencode가 대체됩니다. 공백은 +로 표시되며 이는 %20

으로 대체되어야 합니다. 테스트 결과 여러 주류 브라우저의 지원이 다음과 같은 것으로 나타났습니다.

IE6 attachment; filename=""
FF3 attachment; filename="UTF-8文件名"
attachment; filename*="utf8''"
O9 attachment; filename="UTF-8文件名"
로그인 후 복사

Safari3(Win)이 지원하지 않는 것 같나요? 위의 방법 중 어느 것도 작동하지 않습니다

모든 주류 브라우저를 지원하려면 프로그램을 다음과 같이 작성해야 하는 것 같습니다.

코드는 다음과 같습니다.

$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';
?>
로그인 후 복사

권장 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP 파일 다운로드 시 파일명이 깨졌을 경우 대처 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿