宝哥软件园

Php中文件下载功能的超详细过程分析

编辑:宝哥软件园 来源:互联网 时间:2021-10-09

从服务器下载文件的过程分析:浏览器发送请求访问服务器中的网页(如down.php)。网页的代码如下。收到请求后,服务器立即运行down.php文件。运行文件时,需要读取要下载到内存中的文件(这里是圣诞嘉年华. jpg的图片)。这里,动作是由fopen()函数完成的。注意:与从服务器下载的文件相关的任何操作都必须首先将文件读入服务器的内存。现在文件已经在内存中了。有必要从内存中读取文件。需要注意的是,如果文件很大,应该将文件分多段返回给客户端,而不是在服务器读取完所有文件后再返回给客户端一次,因为这样会增加服务器的负载。因此,我们需要在php代码中设置一次读取的字节数。例如,我在下面的代码中通过$buffer=1024设置了一次读取的字节数,每次读取都会输出数据(即返回给浏览器)。流程图:

复制代码如下:php标题(' 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 ']。Marco fly/PHP study/down/down/';$file_path=$file_sub_path。$ file _ name//首先判断给定文件是否存在,如果(!File_exists($file_path)){ echo '没有文件';返回;} $fp=fopen($file_path,' r ');$ file _ size=file size($ file _ path);//下载文件所需的标头(' content-type : application/octet-stream ');标头('接受-范围:字节');标题('接受-长度: '。$ file _ size);标题('内容-处置:附件;文件名='。$ file _ name);$ buffer=1024$ file _ count=0;while返回数据(!feof($ FP)$ file _ count $ file _ size){ $ file _ con=fread($ FP,$ buffer);$ file _ count=$ bufferecho $ file _ con} fc lose($ 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 '):通过这段代码,客户端浏览器可以知道服务器返回的文件表单头(' accept-ranges : bytes ')。函数的作用:告诉客户端浏览器返回的文件大小是按字节计算的。标头的功能('接受长度: '。$ file _ size):告诉浏览器标头返回的文件大小(' content-disposition 3360附件;文件名='。$file_name)告诉浏览器上述四个Header()是必需的。fclose($fp)可以将缓冲区中最后剩余的数据输出到磁盘文件,并释放文件指针和相关缓冲区。

更多资讯
游戏推荐
更多+