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模拟SQL Server的两个日期处理函数
Oct 09 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
PHP制作图形验证码代码分享
Oct 23 PHP
Symfony2在Nginx下的配置方法图文教程
Feb 04 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
php+js实现的无刷新下载文件功能示例
Aug 23 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
PHP 超级全局变量相关总结
Jun 30 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
图解上海144收音机
2021/03/02 无线电
PHP Class&amp;Object -- 解析PHP实现二叉树
2013/06/25 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
three.js 入门案例详解
2018/01/23 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
Python3处理文件中每个词的方法
2015/05/22 Python
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
python多进程实现文件下载传输功能
2018/07/28 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
优秀员工自荐信范文
2013/10/05 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
党员十八大心得体会
2014/09/12 职场文书
2015年学校教研室主任工作总结
2015/07/20 职场文书
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS