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文件读写操作之文件读取方法详解
Jan 13 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
php中如何防止表单的重复提交
Aug 02 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
深入浅析用PHP实现MVC
Mar 02 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
Mar 02 PHP
CodeIgniter常用知识点小结
May 26 PHP
PHP微信刮刮卡 附微信接口
Jul 22 PHP
php实现的二叉树遍历算法示例
Jun 15 PHP
PHP7匿名类的用法示例
Apr 05 PHP
基于laravel where的高级使用方法
Oct 10 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 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通过字符串调用函数示例
2014/03/02 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
Python字符串转换成浮点数函数分享
2015/07/24 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
Django的CVB实例详解
2020/02/10 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
阿根廷票务网站:StubHub阿根廷
2018/04/13 全球购物
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
函授毕业生的自我鉴定
2013/11/26 职场文书
淘宝客服专员岗位职责
2014/04/11 职场文书
环保倡议书300字
2014/05/15 职场文书
纪检监察建议书
2014/05/19 职场文书
卖房协议书样本
2014/10/30 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
一年级语文教学随笔
2015/08/14 职场文书
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL