1、php下载原理图
2、文件下载源码:
1 <?php 2 $file_name="umiwi.apk";//需要下载的文件 3 $file_dir = "./"; //文件目录 4 $file_path = $file_dir.$file_name;//文件路径 5 $file_name=iconv("utf-8","gb2312","$file_name"); 6 $fp=fopen($file_dir.$file_name,"r+");//下载文件必须先要将文件打开,写入内存 7 if(!file_exists($file_dir.$file_name)){//判断文件是否存在 8 echo "文件不存在"; 9 exit(); 10 } 11 $file_size=filesize($file_dir.$file_name);//判断文件大小 12 13 //返回的文件 14 Header("Content-type: application/octet-stream"); 15 //按照字节格式返回 16 Header("Accept-Ranges: bytes"); 17 //返回文件大小 18 Header("Accept-Length: ".$file_size); 19 //弹出客户端对话框,对应的文件名 20 Header("Content-Disposition: attachment; filename=".$file_name); 21 //防止服务器瞬时压力增大,分段读取 22 $buffer=1024; 23 while(!feof($fp)){ 24 $file_data=fread($fp,$buffer); 25 echo $file_data; 26 } 27 //关闭文件 28 fclose($fp); 29 ?>
3、文件编码问题解决方法:
如果文件名是中文,php的函数不能识别中文文件名,一般如果程序编码为utf-8,php的函数比较古老,只能识别gb2312编码的中文,所以把中文用iconv(“原编码”,”要转成的编码”,”要转码的字符串”)函数可以转码。
比如,把一个字符串从utf-8转码为gb2312
$file_name=iconv(“utf-8”,”gb2312”,”$file_name”);
4、几点注意事项:
header("Content-type:text/html;charset=utf-8")的作用:在服务器响应浏览器的请求时,告诉浏览器以编码格式为UTF-8的编码显示该内容
关于file_exists()函数不支持中文路径的问题:因为php函数比较早,不支持中文,所以如果被下载的文件名是中文的话,需要对其进行字符编码转换,否则file_exists()函数不能识别,可以使用iconv()函数进行编码转换
$file_path 是文件路径,若采用绝对路径,执行效率要比相对路径高
Header("Content-type: application/octet-stream")的作用:通过这句代码客户端浏览器就能知道服务端返回的文件形式
Header("Accept-Ranges: bytes")的作用:告诉客户端浏览器返回的文件大小是按照字节进行计算的
Header("Accept-Length:".$file_size)的作用:告诉浏览器返回的文件大小
Header("Content-Disposition: attachment; filename=".$file_name)的作用:告诉浏览器返回的文件的名称
以上四个Header()是必需的
fclose($fp)可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区
请发表评论