手机版

php实现支持中文的文件下载功能的例子

时间:2021-09-03 来源:互联网 编辑:宝哥软件园 浏览:

本文主要介绍php支持中文的文件下载功能的相关内容,并分享给大家参考学习。下面就不多说了。我们来看看详细的介绍。

问题描述

通常有一种最简单的下载文件的方法,那就是将url直接指向服务器上文件的位置。但是,这种方法存在很大的安全隐患。

公开了服务器的文件目录结构。无法禁止非法请求源,也无法为文件下载请求制定安全验证解决方案

1、将文件下载请求映射到后端程序url

映射功能是使用http服务器(apache/nginx)实现的

这里,以apache为例进行说明

使用apache的重写模块,配置重写规则。(关于如何打开重写模块,网上有很多资源,这里就不赘述了。)创建。项目根目录中的htaccess文件,并编写重写规则。

#上的重写引擎将所有以rar/zip结尾的URL映射到download.php文件重写规则(。* \.(rar | zip))$ download.php文件=$1 [NC]将所有以rar/zip结尾的URL映射到download.php文件(这里,为了方便,直接映射到一个php脚本,如果使用框架,则映射到特定控制器中的一个方法!比如:index.php?c=homea=下载)

二、编写具体的文件下载逻辑

项目目录

以本地项目为例,用户需要下载的zip文件放在当前项目的temp目录下

例子

直接编码,代码中有详细的注释

?Php//接收文件名if(!isset($_GET['file']))退出(' Filename为空');if(空($_GET['file']))退出(' Filename无效');ob _ clean();//清除缓冲区//获取文件名$ filename=basename(URL decode($ _ get[' file ']));//完整文件路径(真实文件存储在临时目录中)$ filepath=_ _ dir _ _。/temp/'。$文件名;//将utf8编码转换为gbk编码,否则中文名文件无法打开$ filepath=iconv ('UTF-8 ',' GBK ',$ file path);//检查文件是否可读如果(!is_file($filePath) ||!is_readable($filePath))退出('无法访问文件'。$ filename);/* * *此处应添加安全验证等代码,如:检测请求来源、验证UA ID等。*///以只读模式打开文件,强制二进制模式$ filehandle=fopen ($ filepath,' Rb ');if($fileHandle===false){ exit('无法打开文件: $ filename ');}//文件类型为二进制流。设置为utf8编码(支持中文文件名)头(' content-type : application/octet-stream;charset=utf-8 ');标题('内容-传输-编码:二进制');标头(' Accept-range s 3360字节');//文件大小头(' content-length : '。file size($ file path));//触发浏览器文件下载功能头(' content-disposition :附件;文件名=' '。' urlencode($filename),''');//循环读取文件内容,并在(!Feof($fileHandle)) {//从文件指针句柄读取最大长度字节(每次10k输出)Echo Fread ($ filehandle,10240);}//关闭文件流fc lose($ FileHandle);这只是一个例子(仅包括核心功能)。为了便于解释,直接从url获取用户想要下载的文件的名称。

注意下面两行代码(为了下载有中文名字的文件)

$filePath=iconv('UTF-8 ',' gbk ',$ filePath);标题('内容类型:应用程序/八位字节流;charset=utf-8 ');如果用户需要下载中文名称的文件。文件路径需要转换成gbk编码,否则会出现文件不存在等错误。在表头设置utf8编码,也是这个道理

下载文件

打开浏览器,访问http://127 . 0 . 0 . 1/重写/尴尬。压缩文件并下载。

摘要

以上就是本文的全部内容。希望本文的内容能给你的学习或工作带来一些帮助。有问题可以留言交流。谢谢你的支持。

版权声明:php实现支持中文的文件下载功能的例子是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。