问题说明

文件下载,通常有一种最为简单的方法,那就是将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如何实现下载功能相关推荐

  1. QT学习笔记(-): 利用QHttp进行http下载(1)

    利用 Qhttp 实现http下载 今天学习了一下Qt的http下载(当然,利用http也可以实现上传), 利用的是QHttp这个类来实现, 实现方式比较简单, 下面给出实现方法供大家参考. 我们新建 ...

  2. ncm 汇集 matlab,ncm-solutions 压缩包中的文件主要是基于matlab的数值计算以及分析功能学习的很好的例程 266万源代码下载- www.pudn.com...

    文件名称: ncm-solutions下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 1650 KB 上传时间: 2016-11-01 下载次数: 0 提 ...

  3. 这月薪过万的Java高级学习资料,难得一遇的干货,不下载真可惜了!

    大家有没有想我呢 不管你们想不想我 我挺想你们的 通过昨天我不断的 死气白咧各种说好话 最终 要到了Java学科的Java集合学习资料 里面包含视频+资料+源码 堂兄也有一个愿望 希望你们月薪过万后 ...

  4. 人力资源学python有意义吗-python爬虫抖音 个人资料 仅供学习参考 切勿用于商业...

    本文仅供学习参考 切勿用于商业 本次爬取使用fiddler+模拟器(下载抖音APP)+pycharm 1. 下载最新版本的fiddler(自行百度下载),以及相关配置 1.1.依次点击,菜单栏-Too ...

  5. Android 6.0 指纹识别功能学习(一)----阿冬专栏!!!

    转载自:http://www.cnblogs.com/changyuet/p/5535082.html 由于毕设需要设计增强的身份认证(生物特征认证方式),所以需要学习指纹识别相关的android6. ...

  6. 仿闪照功能娱乐微信小程序源码下载-带外卖CPS功能和流量主

    相信大家都知道闪照这个功能吧 比如一些照片防止别人保存就限制了用户观看时间等等 这款小程序的功能也就是类似如此 支持自定义用户可以查看多少秒那些,具体大家应该都知道 好像小编以前也有发布过一款,不过这 ...

  7. (已更新)闪照功能娱乐微信小程序源码下载

    相信大家都知道闪照这个功能吧 这款小程序的功能也就是类似如此 支持自定义用户可以查看多少秒那些,具体大家应该都知道 好了不多说,下面来看看小编的测试演示图吧! 小程序源码下载地址:(已更新)闪照功能娱 ...

  8. 【小程序源码】精美UI强大娱乐功能组合微信小程序源码下载,安装简单

    这是一个多娱乐功能的小程序 具体由以下功能组合: 在线音乐 短视频去印 外卖CPS(外卖平台优惠劵) 打车CPS(打车平台优惠劵) 头像功能(多分类头像,另外还支持姓氏头像制作) 图片加水印 表情包功 ...

  9. 【小程序源码】升级版王者荣耀铭文多功能助手微信小程序源码下载

    这是一个王者铭文小程序 支持每一个英雄的铭文出装推荐查看 支持铭文组合模拟数据 另外还支持游戏重复名生成和空白名生成 比之前分享的一款单一铭文好一点吧 废话不多说,下面就一起来看看小编的测试演示图吧! ...

最新文章

  1. sql server 语句自动补齐
  2. java医疗框架,java毕业设计_springboot框架的城市智慧医疗服务系统
  3. 设计模式(5)--工厂模式
  4. python支持复数以及相关的运算吗_Python: 复数的数学运算
  5. 工作288:跨组件传值
  6. LeetCode 270. 最接近的二叉搜索树值
  7. 多语言网站开发 不完全技术分析收录
  8. AD数据库备份[为企业部署Windows Server 2008系列十五]
  9. Java 将Excel转为XML
  10. iperf/LANSpeedTest网络传输速度测试工具
  11. github rust 项目Travis ci配置
  12. cortex系列处理器排行_ARM Cortex-M 处理器家族介绍和比较-控制器/处理器-与非网...
  13. mysql的下载安装
  14. UI设计要学什么,这份UI学习路线图告诉你
  15. 信息熵、gini、信息增益
  16. 拨号上网场景下路由器的配置
  17. 2021-11-09 - Redis - GUI Tool - RDM - 学习/实践
  18. ppt文件转pdf文件转换器绿色版
  19. 解读 iOS(马甲包) 组件化与路由的本质
  20. node 16.X 或更高版本 fibers 出错 is missing.

热门文章

  1. Python 2.x vs Python 3(三)
  2. java bfs dfs_java优先搜索(DFS/BFS)实际应用
  3. 坐标轨迹计算_【老杨讲坛】737NG无系留最大风速限制的插值计算
  4. python和c先学哪个-python和c先学哪个
  5. 学python可以做什么职业-学完Python,能找到什么工作?工资多少?
  6. python是什么软件-学习python用什么软件
  7. 语音识别 AI 挑战赛上线:用深度学习三种结构,对 50 种环境声音分类!
  8. 百度免费开放长语音识别功能
  9. mysql 5.6 bug_MySQL 5.6的一个bug引发的故障
  10. jsch 长连接_广濑连接器DF13