PHP实现下载功能以及防止referer盗链
2023-06-13 09:15:30 时间
请注意,本文编写于 656 天前,最后修改于 655 天前,其中某些信息可能已经过时。
首先网络上关于PHP下载的方法很多,简单说下: 贴代码,注释已经非常清晰了
$filename = "test.gif";
header('Content-Type:image/gif'); //指定下载文件类型
header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下载文件的描述
header('Content-Length:'.filesize($filename)); //指定下载文件的大小
//将文件内容读取出来并直接输出,以便下载
readfile($filename);
这种的简单方便,但是对于中文名字的不友好,
<?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
防止别人盗用下载的目的无非是减小自己的服务器压力
$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 文件,普通的 右键
新建文件方式是行不通(windows系统),可以打开记事本,然后另存为,选择文件类型为所有文件,然后输入文件名
步骤三:打开htaccess 写入:
RewriteEngine On RewriteCond %{REQUEST_FILENAME}
.*\.(jpg|jpeg|gif|png) [NC] RewriteCond %{HTTP_REFERER}
!localhost[NC] 把localhost 换成你网站的域名
基本上这样就能阻止大部分的referer盗链了。
相关文章
- php面试之面向对象的相关知识(下篇)
- PHP对接chatGPT代码,openai接口对接,php 实现chatGPT功能
- Redis实战:PHP开发者必备技能(redis实战php)
- PHP实现分组 类似mysql groupby+in读取详解编程语言
- PHP中实现Redis队列的挑战与实践(php队列redis)
- 配置PHP实现MySQL数据库连接(php连接mysql配置)
- php开发MySQL 4.1 PHP开发:越来越优秀(mysql4.1)
- 从MySQL到PHP:展示表格数据(php显示mysql表)
- PHP实现MySQL表格删除(php删除mysql表)
- PHP操纵Redis实例:快速高效存储数据(php操作redis实例)
- Linux环境下,如何高效、简单地编写PHP代码(linux下写php)
- 深入理解MySQL转义在PHP中的应用技巧(mysql转义php)
- 使用PHP实现Redis队列(redis队列php)
- 实现PHP的Redis扩展安装(php安装redis扩展)
- PHP技术防止MSSQL注入风险(php防止mssql注入)
- 用PHP访问本地MSSQL数据库的实现方法(php访问本地mssql)
- PHP连接MSSQL实现数据库操作(php用mssql)
- PHP如何连接MSSQL服务器(php怎么连mssql)
- PHP与MySQL实现三表关联操作(mysql三表关联pHP)
- 基于PHP的Redis队列监控实践(redis队列监控php)
- PHP通过正则表达式下载图片到本地的实现代码
- php对csv文件的读取,写入,输出下载操作详解
- php实现文件下载(支持中文文名)