-
- header("Content-type:text/html;charset=utf-8");
- // $file_name="cookie.jpg";
- $file_name="Christmas Carnival.jpg ";
- //To solve the problem that Chinese cannot be displayed
- $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;
- //First determine whether the given file exists
- if(!file_exists($file_path)){
- echo "There is no such file";
- return ;
- }
- $fp=fopen($file_path,"r");
- $file_size=filesize($file_path);
- //The header needed to download the file
- 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;
- //Return data to the browser
- while(!feof($fp) && $file_count<$file_size){
- $file_con=fread($fp,$buffer);
- $file_count+=$buffer;
- echo $file_con;
- }
- fclose($fp);
- ?>
-
Copy code
Notes:
The role of header("Content-type:text/html;charset=utf-8"): When the server responds to the browser's request, it tells the browser to display the content in UTF-8 encoding.
Regarding the problem that the file_exists() function does not support Chinese paths: Because the PHP function is relatively early and does not support Chinese, so if the downloaded file name is in Chinese, it needs to be character encoding converted, otherwise the file_exists() function cannot recognize it. You can Use the iconv() function for encoding conversion.
$file_sub_path() I use absolute paths, which are more efficient than relative paths.
The role of Header("Content-type: application/octet-stream"): Through this code, the client browser can know the file form returned by the server
The role of Header("Accept-Ranges: bytes"): tells the client that the file size returned by the browser is calculated in bytes
The role of Header("Accept-Length:".$file_size): tells the browser the size of the file returned
The role of Header("Content-Disposition: attachment; filename=".$file_name): tells the browser the name of the file returned
The above four Header() are required
fclose($fp) can output the last remaining data in the buffer to a disk file and release the file pointer and related buffers. |