十,PHP下载文件
1,文件类型
(1)文本文件,如xx.txt。
(2)二进制文件,如图片、视频、音频。
2,文件下载流程如下图所示,首先浏览器向服务器发送下载请求,服务器将下载资源读入内存,再通过http将资源返回到指定的目录。
3,下载具体代码如下:
function down_file($file_name, $file_sub_dir){ // $file_name="se.jpg"; //php文件系统默认是gb2312,我们现在通用的utf-8,因此需要把文件名转化为gb2312 $file_name = iconv("utf-8","GB2312",$file_name); $file_path = $_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name; // $file_path = $_SERVER['DOCMENT_ROOT']."/images/".$file_name; //1。打开文件 if(!file_exists($file_path)){ echo "文件不存在!"; return; } $fp = fopen($file_path,"r"); $file_size = filesize($file_path); if($file_size > 1024*10*1024){ //限制下载大文件,10M // echo "文件过大,不能下载"; echo "<script language='javascript'>window.alert('文件太大,不提供下载服务!');</script>"; return; } //返回的文件 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_size-$file_count > 0)){ $file_data = fread($fp,$buffer); $file_count += $buffer; echo $file_data; } fclose($fp); } down_file("se.jpg", "/blog/webroot/images/");
注意:(1)php的文件系统比较旧,用的字符编码是gb2312,现在大部份文件是utf-8编码,因此需要对文件名进行转码,将utf-8转化为gb2312:
$file_name = iconv("utf-8","GB2312",$file_name);
(2)文件路径用绝对路径,也可以使用相对路径,绝对路径效率更高,
$file_path = $_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;
php相对路径表示,比如代码页a.php,同目录下有个文件夹image,文件夹中有b.jpg,那么a.php;利用相对路径引用b.jpg时候
$file_path = "./image/b.jpg";
如果image和a.php的父目录同级别,
$file_path = "./../image/b.jpg";
4,网页禁止某个ip访问,
if($_SERVER['REMOTE_ADDR'] == "192.168.1.100"){ echo "禁止你访问!"; }
5,防盗链技术,网站中某些网页希望登陆之后查看,
<?php /** * Created by PhpStorm. * User: usa007lhy * Date: 2015/10/18 * Time: 19:54 */ if(isset($_SERVER['HTTP_REFERER'])){ if(strpos($_SERVER['HTTP_REFERER'],"http://localhost/http") == 0){ echo "韩顺平的账号信息..."; }else{ header("Location:warning.php"); } }else{ header("Location:warning.php"); } ?>