php实现支持中文的文件下载功能示例


Posted in PHP onAugust 30, 2017

前言

本文主要给大家介绍了关于php实现支持中文的文件下载功能的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

问题说明

文件下载,通常有一种最为简单的方法,那就是将url直接指向服务器上文件的所在位置。但是这个方法存在很大的安全隐患。

  • 暴露了服务器文件目录结构
  • 无法禁止非法请求来源,无法对文件下载请求做安全验证

解决方案

一、将文件下载请求映射到后端程序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实现支持中文的文件下载功能示例

示例

直接上代码,代码中有详细注释

<?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异常处理技术,顶级异常处理器
Jun 13 PHP
PHP系统命令函数使用分析
Jul 05 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
PHP从FLV文件获取视频预览图的方法
Mar 12 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
PHP的Json中文处理解决方案
Sep 29 PHP
php利用fsockopen GET/POST提交表单及上传文件
May 22 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
Oct 08 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 #PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 #PHP
PHP单例模式与工厂模式详解
Aug 29 #PHP
PHP迭代与递归实现无限级分类
Aug 28 #PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 #PHP
PHP大文件分割上传 PHP分片上传
Aug 28 #PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 #PHP
You might like
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
php文件下载处理方法分析
2015/04/22 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
javascript常用的方法分享
2015/07/01 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
毕业生医学检验求职信
2013/10/16 职场文书
授权委托书怎么写
2014/04/03 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
工会主席事迹材料
2014/06/03 职场文书
实验室的标语
2014/06/20 职场文书
先进单位申报材料
2014/12/25 职场文书
财务部岗位职责范本
2015/04/14 职场文书
尼克胡哲观后感
2015/06/08 职场文书
工作简报怎么写
2015/07/21 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
社区宣传标语口号
2015/12/26 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers