PHP实现下载功能以及防止referer盗链

2023-03-05 15:07:23 浏览数 (1)

请注意,本文编写于 656 天前,最后修改于 655 天前,其中某些信息可能已经过时。

首先网络上关于PHP下载的方法很多,简单说下: 贴代码,注释已经非常清晰了

代码语言:javascript复制
$filename = "test.gif";
header('Content-Type:image/gif'); //指定下载文件类型
header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下载文件的描述
header('Content-Length:'.filesize($filename)); //指定下载文件的大小
//将文件内容读取出来并直接输出,以便下载
readfile($filename);

这种的简单方便,但是对于中文名字的不友好,

代码语言:javascript复制
<?php
    //在服务器响应浏览器的请求时,告诉浏览器以编码格式为UTF-8的编码显示该内容
    header("Content-type:text/html;charset=utf-8");
    $file_name = $_GET['name'];
    if(!trim($file_name)){
        echo "参数错误";
        exit;
    }
    //用以解决中文不能显示出来的问题
    //关于file_exists()函数不支持中文路径的问题:
    //因为php函数比较早,不支持中文,所以如果被下载的文件名是中文的话,需要对其进行字符编码转换,
    //否则file_exists()函数不能识别,可以使用iconv()函数进行编码转换
    //现在PHP中文都支持了,所以icon转不转换都行
    //$file_name=iconv("utf-8","gb2312",$file_name);
    $file_sub_path=$_SERVER['DOCUMENT_ROOT']."temp/down/";//我使用的是绝对路径,执行效率要比相对路径高
    $file_path=$file_sub_path.$file_name.'.zip';
    //首先要判断给定的文件存在与否
    if(!file_exists($file_path)){
        echo "该文件不存在";
        exit;
    }
    $fp=fopen($file_path,"r");
    $file_size=filesize($file_path);
    //下载文件需要用到的头
    //通过这句代码客户端浏览器就能知道服务端返回的文件形式
    Header("Content-type: application/octet-stream");
    Header("Accept-Ranges: bytes");//告诉客户端浏览器返回的文件大小是按照字节进行计算的
    Header("Accept-Length:".$file_size);//告诉浏览器返回的文件大小
    Header("Content-Disposition: attachment; filename=".$file_name.'.zip');//告诉浏览器返回的文件的名称
    $buffer=1024;
    $file_count=0;
    //向浏览器返回数据
    while(!feof($fp) && $file_count<$file_size){
        $file_con=fread($fp,$buffer);
        $file_count =$buffer;
        echo $file_con;
    }
    fclose($fp);

以上四个Header()是必需的 fclose($fp)可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区

防止referer

防止别人盗用下载的目的无非是减小自己的服务器压力

代码语言:javascript复制
$ref = $_SERVER [ 'HTTP_REFERER' ]; 
if ( $ref == '' ){ 
    echo  '对不起,不允许从地址栏访问' ; exit;
} else { 
    $url = parse_url ( $ref ); 
    if ( $url [host]!= 'blog.zmzhz.com'){ 
       echo  '不允许盗链' ; 
       exit (); 
    } 
}

当然这种的就简单了,别人也可以模仿referer来进行操作,那么必须在服务器端做文章了

步骤一:开启模块LoadModulerewrite_module modules/mod_rewrite.so,重启服务器

步骤二:在网站的目录下 创建 .htaccess 文件,普通的 右键

代码语言:javascript复制
新建文件方式是行不通(windows系统),可以打开记事本,然后另存为,选择文件类型为所有文件,然后输入文件名

步骤三:打开htaccess 写入:

代码语言:javascript复制
RewriteEngine On RewriteCond %{REQUEST_FILENAME}
.*.(jpg|jpeg|gif|png) [NC] RewriteCond %{HTTP_REFERER}
!localhost[NC] 把localhost 换成你网站的域名

基本上这样就能阻止大部分的referer盗链了。

0 人点赞