Analysis of the process of the client downloading files from the server:
The browser sends a request to access a certain web page in the server (such as: down.php). The code of the web page is as follows.
After the server receives the request, it immediately runs the down.php file
When running the file, the file to be downloaded must be read into the memory (here is the picture of Christmas Carnival.jpg). This action is completed here through the fopen() function
Note: Any file operation related to downloading from the server must first read the file into the memory on the server side
Now the file is already in the memory, this The file needs to be read from the memory, and this action is completed through the fread() function
It should be noted that if the file is large, the file should be divided into multiple segments and returned to the client, instead of waiting for the file to be read completely on the server. After the retrieval is completed, return it to the client all at once, because this will increase the load on the server.
So we need to set the number of bytes read once in the php code. For example, I set the number of bytes read once through $buffer=1024 in the following code. Every time it is read, the data is output (i.e. Return to the browser)
Flowchart:
Copy code The code is as follows:
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 "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);
?>
A few things to note:
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
About 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 iconv( ) function for encoding conversion
$file_sub_path() I use an absolute path, which is more efficient than a relative path
The role of Header("Content-type: application/octet-stream"): through this code The client browser can know the file format returned by the server
Header("Accept-Ranges: bytes"): Tell the client browser that the size of the file returned is calculated in bytes
Header( The role of "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 the disk file and release the file pointer and related buffers
http://www.bkjia.com/PHPjc/325568.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/325568.htmlTechArticleProcess analysis of client downloading files from the server: The browser sends a request to access a certain file in the server Web page (such as: down.php), the code of this web page is as follows. Server picks up...