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 相关文章推荐
附件名前加网站名
Mar 23 PHP
利用PHP制作简单的内容采集器的原理分析
Oct 01 PHP
PHP 第二节 数据类型之字符串类型
Apr 28 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
php计算2个日期的差值函数分享
Feb 02 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
PHP使用flock实现文件加锁的方法
Jul 01 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
Mar 18 PHP
PHP程序员必须知道的两种日志实例分析
May 14 PHP
PHP实现rar解压读取扩展包小结
Jun 03 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网上商城购物车设计代码分享
2012/02/15 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
javascript 写类方式之一
2009/07/05 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
BootStrap按钮标签及基本样式
2016/11/23 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
详解Django admin高级用法
2019/11/06 Python
Python递归实现打印多重列表代码
2020/02/27 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
客户经理岗位职责大全
2015/04/09 职场文书
2015年初三班主任工作总结
2015/05/21 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android
配置nginx负载均衡
2022/05/06 Servers
浅谈Redis的事件驱动模型
2022/05/30 Redis