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 相关文章推荐
初探PHP5
Oct 09 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
Jan 07 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
Nov 19 PHP
php判断当前用户已在别处登录的方法
Jan 06 PHP
PHP读取mssql json数据中文乱码的解决办法
Apr 11 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
深入浅出讲解:php的socket通信原理
Dec 03 PHP
php中通用的excel导出方法实例
Dec 30 PHP
PHP生成推广海报的方法分享
Apr 22 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
php rsa加密解密使用详解
2015/01/14 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
Js四则运算函数代码
2012/07/21 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
jquery.validate使用详解
2016/06/02 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
使用python爬取B站千万级数据
2018/06/08 Python
Python中的取模运算方法
2018/11/10 Python
Python中os模块功能与用法详解
2020/02/26 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
统计员岗位职责
2013/11/14 职场文书
行政经理的岗位职责
2013/11/23 职场文书
好的演讲稿开场白
2013/12/30 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
心理健康日活动总结
2014/05/08 职场文书
企业读书活动总结
2014/06/30 职场文书
员工试用期自我评价
2014/09/18 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
经验交流材料格式
2014/12/30 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
《窃读记》教学反思
2016/02/18 职场文书
委托书范本格式
2019/04/18 职场文书