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边学边教》(02.Apache+PHP环境配置――下篇)
Dec 13 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
解析linux下安装memcacheq(mcq)全过程笔记
Jun 27 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
Jul 05 PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
php strftime函数的详细用法
Jun 21 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
CI框架网页缓存简单用法分析
Dec 26 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 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
header导出Excel应用示例
2014/01/24 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
JavaScript 面向对象之命名空间
2010/05/04 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
Django实现图片文字同时提交的方法
2015/05/26 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
创业计划书撰写原则
2014/01/25 职场文书
甜美蛋糕店创业计划书
2014/01/30 职场文书
公司会计岗位职责
2014/02/13 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
大学毕业论文致谢词
2015/05/14 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
MySQL GRANT用户授权的实现
2021/06/18 MySQL