간단한 파일을 다운로드하려면 HTML 연결 태그 를 사용하고 href 속성의 URL 값을 다운로드된 파일로 지정하기만 하면 됩니다. 표시:
위 코드를 통해 파일 다운로드를 구현하면 브라우저가 기본적으로 인식할 수 없는 일부 MIME 형식의 파일만 처리할 수 있습니다. 예를 들어 book.rar 파일에 접근하면 브라우저가 직접 열지 않고 팝업이 뜹니다. 다운로드 프롬프트 상자를 표시합니다. 사용자에게 "다운로드" 또는 "열기" 및 기타 처리 방법을 묻는 메시지를 표시합니다. 그러나 이 연결 양식을 사용하면 접미사가 .html인 웹 페이지 파일, 이미지 파일, PHP 프로그램 스크립트 파일 등을 다운로드해야 하는 경우 파일 내용이 브라우저에 직접 출력되며 사용자에게 메시지가 표시되지 않습니다. 다운로드.
header(‘Content-Type:imge/gif'); //发送指定文件MIME类型的头信息 header(‘Content-Disposition:attachment; filename=”test.gif”‘); //发送描述文件的头信息,附件和文件名 header(‘Content-Length:3390′); //发送指定文件大小的信息,单位字节
header() 함수를 사용하여 이 세 줄의 헤더 정보를 브라우저에 보내면 test.gif 이미지가 브라우저에 직접 표시되지 않지만 브라우저는 해당 파일을 다운로드 형식으로 포맷합니다. header() 함수에서 "Content-Type"은 파일의 MIME 유형을 지정하고, "Content_Disposition"은 파일을 설명하는 데 사용되며, "attachment; filename="test.gif"" 값은 이것이 첨부 파일임을 나타냅니다. 그리고 다운로드를 지정합니다. 파일 이름 뒤에 "Content_Length"는 다운로드된 파일의 크기를 제공합니다.
헤더 정보를 설정한 후 다운로드를 위해서는 파일 내용을 브라우저에 출력해야 합니다. PHP의 파일 시스템 기능을 사용하여 파일 내용을 읽고 브라우저에 직접 출력할 수 있습니다. 가장 편리한 방법은 readfile() 함수를 사용하여 파일 내용을 읽고 직접 출력하는 것입니다. 다음과 같이 test.gif 파일을 다운로드합니다.
<?php $filename = "test.gif"; header('Content-Type:image/gif'); //指定下载文件类型 header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下载文件的描述 header('Content-Length:'.filesize($filename)); //指定下载文件的大小 //将文件内容读取出来并直接输出,以便下载 readfile($filename); ?>
위에서 중국어 이름이 나오면 정상적으로 다운로드가 되지 않습니다. 중국어 이름이 있는 파일을 다운로드하기 위한 다른 파일 다운로드 예제 코드를 찾았습니다
<?php header("Content-type:text/html;charset=utf-8"); // $file_name="cookie.jpg"; $file_name="圣诞狂欢.jpg"; //用以解决中文不能显示出来的问题 $file_name=iconv("utf-8","gb2312",$file_name); $file_sub_path=$_SERVER['DOCUMENT_ROOT']."marcofly/phpstudy/down/down/"; $file_path=$file_sub_path.$file_name; //首先要判断给定的文件存在与否 if(!file_exists($file_path)){ echo "没有该文件文件"; return ; } $fp=fopen($file_path,"r"); $file_size=filesize($file_path); //下载文件需要用到的头 Header("Content-type: application/octet-stream"); Header("Accept-Ranges: bytes"); Header("Accept-Length:".$file_size); Header("Content-Disposition: attachment; filename=".$file_name); $buffer=1024; $file_count=0; //向浏览器返回数据 while(!feof($fp) && $file_count<$file_size){ $file_con=fread($fp,$buffer); $file_count+=$buffer; echo $file_con; } fclose($fp); ?>
헤더("Content-type:text/html;charset=utf-8")의 역할: 서버가 브라우저의 요청에 응답하면 브라우저에 콘텐츠를 UTF-8 인코딩으로 표시하라고 지시합니다
file_exists() 함수가 중국어 경로를 지원하지 않는 문제에 대해: php 함수가 비교적 초기이고 중국어를 지원하지 않기 때문에 다운로드한 파일명이 중국어인 경우 문자 인코딩을 변환해야 하고, 그렇지 않으면 file_exists() 함수는 식별을 위해 인코딩 변환을 위해 iconv() 함수를 사용할 수 있습니다
$file_sub_path() 상대 경로보다 효율적인 절대 경로를 사용합니다
Header("Content-type: application/octet-stream")的作用:通过这句代码客户端浏览器就能知道服务端返回的文件形式 Header("Accept-Ranges: bytes")的作用:告诉客户端浏览器返回的文件大小是按照字节进行计算的 Header("Accept-Length:".$file_size)的作用:告诉浏览器返回的文件大小 Header("Content-Disposition: attachment; filename=".$file_name)的作用:告诉浏览器返回的文件的名称
위 4개의 Header()가 필수입니다
fclose($fp)는 버퍼에 마지막 남은 데이터를 디스크 파일로 출력하고 파일 포인터 및 관련 버퍼를 해제할 수 있습니다