php 实现资料下载功能,学习猿地-php如何实现下载功能
问题说明
文件下载,通常有一种最为简单的方法,那就是将url直接指向服务器上文件的所在位置。但是这个方法存在很大的安全隐患。
1.暴露了服务器文件目录结构
2.无法禁止非法请求来源,无法对文件下载请求做安全验证
解决方案
一、将文件下载请求映射到后端程序url
借助http服务器(apache/nginx)实现映射功能
这里以apache为例进行说明
借助apache的rewrite模块,配置rewrite规则。(关于如何开启rewrite模块,网上很多资源,这里不再赘诉)
在项目根目录下创建.htaccess文件,写入rewrite规则RewriteEngine on
#将所有以rar/zip结尾的url,映射给download.php文件
RewriteRule (.*\.(rar|zip))$ download.php?file=$1 [NC]
将所有以rar/zip结尾的url,映射给download.php文件(这里为了方便直接映射到了一个php脚本中,如果是使用框架,那就映射到具体的控制器中的某个方法!例如:index.php?c=home&a=download)
二、编写具体的文件下载逻辑
项目目录
以本地项目为例,用户需要下载的zip文件,放在当前项目的temp目录下
示例
直接上代码,代码中有详细注释<?php
//接收需要下载的文件名称
if(!isset($_GET['file'])) exit('Filename is empty');
if(empty($_GET['file'])) exit('Filename not valid');
ob_clean();//清除一下缓冲区
//获得文件名称
$filename = basename(urldecode($_GET['file']));
//文件完整路径(这里将真实的文件存放在temp目录下)
$filePath = __DIR__."/temp/".$filename;
//将utf8编码转换成gbk编码,否则,文件中文名称的文件无法打开
$filePath = iconv('UTF-8','gbk',$filePath);
//检查文件是否可读
if(!is_file($filePath) || !is_readable($filePath)) exit('Can not access file '.$filename);
/**
* 这里应该加上安全验证之类的代码,例如:检测请求来源、验证UA标识等等
*/
//以只读方式打开文件,并强制使用二进制模式
$fileHandle=fopen($filePath,"rb");
if($fileHandle===false){
exit("Can not open file: $filename");
}
//文件类型是二进制流。设置为utf8编码(支持中文文件名称)
header('Content-type:application/octet-stream; charset=utf-8');
header("Content-Transfer-Encoding: binary");
header("Accept-Ranges: bytes");
//文件大小
header("Content-Length: ".filesize($filePath));
//触发浏览器文件下载功能
header('Content-Disposition:attachment;filename="'.urlencode($filename).'"');
//循环读取文件内容,并输出
while(!feof($fileHandle)) {
//从文件指针 handle 读取最多 length 个字节(每次输出10k)
echo fread($fileHandle, 10240);
}
//关闭文件流
fclose($fileHandle);
这里只是做了一个示例(只包括核心功能),为了方便说明直接以GET方式从url中获取用户想要下载的文件名称
注意以下两行代码(为了能够下载中文名称的文件)$filePath = iconv('UTF-8','gbk',$filePath);
header('Content-type:application/octet-stream; charset=utf-8');
如果用户需要下载的是中文名称的文件。则需要将文件路径转换成gbk编码,否则会出现 文件不存在 之类的错误。header中设置utf8编码,也是同样的道理
下载文件
打开浏览器,访问 http://127.0.0.1/rewrite/尴尬.zip 文件便开始下载了。
【推荐学习:PHP视频教程】
php 实现资料下载功能,学习猿地-php如何实现下载功能相关推荐
- QT学习笔记(-): 利用QHttp进行http下载(1)
利用 Qhttp 实现http下载 今天学习了一下Qt的http下载(当然,利用http也可以实现上传), 利用的是QHttp这个类来实现, 实现方式比较简单, 下面给出实现方法供大家参考. 我们新建 ...
- ncm 汇集 matlab,ncm-solutions 压缩包中的文件主要是基于matlab的数值计算以及分析功能学习的很好的例程 266万源代码下载- www.pudn.com...
文件名称: ncm-solutions下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 1650 KB 上传时间: 2016-11-01 下载次数: 0 提 ...
- 这月薪过万的Java高级学习资料,难得一遇的干货,不下载真可惜了!
大家有没有想我呢 不管你们想不想我 我挺想你们的 通过昨天我不断的 死气白咧各种说好话 最终 要到了Java学科的Java集合学习资料 里面包含视频+资料+源码 堂兄也有一个愿望 希望你们月薪过万后 ...
- 人力资源学python有意义吗-python爬虫抖音 个人资料 仅供学习参考 切勿用于商业...
本文仅供学习参考 切勿用于商业 本次爬取使用fiddler+模拟器(下载抖音APP)+pycharm 1. 下载最新版本的fiddler(自行百度下载),以及相关配置 1.1.依次点击,菜单栏-Too ...
- Android 6.0 指纹识别功能学习(一)----阿冬专栏!!!
转载自:http://www.cnblogs.com/changyuet/p/5535082.html 由于毕设需要设计增强的身份认证(生物特征认证方式),所以需要学习指纹识别相关的android6. ...
- 仿闪照功能娱乐微信小程序源码下载-带外卖CPS功能和流量主
相信大家都知道闪照这个功能吧 比如一些照片防止别人保存就限制了用户观看时间等等 这款小程序的功能也就是类似如此 支持自定义用户可以查看多少秒那些,具体大家应该都知道 好像小编以前也有发布过一款,不过这 ...
- (已更新)闪照功能娱乐微信小程序源码下载
相信大家都知道闪照这个功能吧 这款小程序的功能也就是类似如此 支持自定义用户可以查看多少秒那些,具体大家应该都知道 好了不多说,下面来看看小编的测试演示图吧! 小程序源码下载地址:(已更新)闪照功能娱 ...
- 【小程序源码】精美UI强大娱乐功能组合微信小程序源码下载,安装简单
这是一个多娱乐功能的小程序 具体由以下功能组合: 在线音乐 短视频去印 外卖CPS(外卖平台优惠劵) 打车CPS(打车平台优惠劵) 头像功能(多分类头像,另外还支持姓氏头像制作) 图片加水印 表情包功 ...
- 【小程序源码】升级版王者荣耀铭文多功能助手微信小程序源码下载
这是一个王者铭文小程序 支持每一个英雄的铭文出装推荐查看 支持铭文组合模拟数据 另外还支持游戏重复名生成和空白名生成 比之前分享的一款单一铭文好一点吧 废话不多说,下面就一起来看看小编的测试演示图吧! ...
最新文章
- sql server 语句自动补齐
- java医疗框架,java毕业设计_springboot框架的城市智慧医疗服务系统
- 设计模式(5)--工厂模式
- python支持复数以及相关的运算吗_Python: 复数的数学运算
- 工作288:跨组件传值
- LeetCode 270. 最接近的二叉搜索树值
- 多语言网站开发 不完全技术分析收录
- AD数据库备份[为企业部署Windows Server 2008系列十五]
- Java 将Excel转为XML
- iperf/LANSpeedTest网络传输速度测试工具
- github rust 项目Travis ci配置
- cortex系列处理器排行_ARM Cortex-M 处理器家族介绍和比较-控制器/处理器-与非网...
- mysql的下载安装
- UI设计要学什么,这份UI学习路线图告诉你
- 信息熵、gini、信息增益
- 拨号上网场景下路由器的配置
- 2021-11-09 - Redis - GUI Tool - RDM - 学习/实践
- ppt文件转pdf文件转换器绿色版
- 解读 iOS(马甲包) 组件化与路由的本质
- node 16.X 或更高版本 fibers 出错 is missing.
热门文章
- Python 2.x vs Python 3(三)
- java bfs dfs_java优先搜索(DFS/BFS)实际应用
- 坐标轨迹计算_【老杨讲坛】737NG无系留最大风速限制的插值计算
- python和c先学哪个-python和c先学哪个
- 学python可以做什么职业-学完Python,能找到什么工作?工资多少?
- python是什么软件-学习python用什么软件
- 语音识别 AI 挑战赛上线:用深度学习三种结构,对 50 种环境声音分类!
- 百度免费开放长语音识别功能
- mysql 5.6 bug_MySQL 5.6的一个bug引发的故障
- jsch 长连接_广濑连接器DF13