php上传中文文件名乱码问题处理方案


Posted in PHP onFebruary 03, 2015

php上传文件是最最基础的一个技术点,但是深入进去也有不少问题需要解决,这不,上传中文文件后,文件名变成了乱码。

下面是问题代码,很简单:

1.问题代码

html部分:

 <html>

 <body>

 <form action="upload_file.php" method="post"

 enctype="multipart/form-data">

 <label for="file">Filename:</label>

 <input type="file" name="file" id="file" /> 

 <br />

 <input type="submit" name="submit" value="Submit" />

 </form>

 </body>

 </html>

php部分:
 

 <?php

 if ($_FILES["file"]["error"] > 0)

 {

     echo "Return Code: " . $_FILES["file"]["error"] . "<br />";

 }else

 {

     echo "Upload: " . $_FILES["file"]["name"] . "<br />";

     echo "Type: " . $_FILES["file"]["type"] . "<br />";

     echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";

     echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

     if (file_exists("upload/" . $_FILES["file"]["name"]))

     {

         echo $_FILES["file"]["name"] . " already exists. ";

     }

     else

     {

       move_uploaded_file($_FILES["file"]["tmp_name"],

       "upload/" . $_FILES["file"]["name"]);

     }

 }

上传了一个文件名为“测试数据.txt”的文件,oh ho,文件是传上去了,但是文件名为乱码。

2.初试

网上搜索一下解决方案,将

move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);

改成

move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . iconv("UTF-8","gbk",$_FILES["file"]["name"]));

结果发现iconv函数返回值为false。

查一下函数手册,发现第二个参数有特别的用法,简单翻译一下就是我可以在编码的后面追加//TRANSLIT 或 //IGNORE ,前者会将无法翻译的字符转成最接近的字符,后者就是直接忽略不能转化的字符。

php上传中文文件名乱码问题处理方案

试一下:

var_dump( iconv("UTF-8","gbk//TRANSLIT",$_FILES["file"]["name"]));

var_dump( iconv("UTF-8","gbk//IGNORE",$_FILES["file"]["name"]));

结果:

bool(false) string(4) ".txt"

也就是说中文都没法转化,甚至连接近的字符都没有,看来网上介绍的方法也并非万能。

3.网上介绍方法失败,再尝试

猜测一下,也许我的系统在创建中文文件的时候会乱码,于是我将代码改写了一下:

move_uploaded_file($_FILES["file"]["tmp_name"], "upload/测试数据.txt");

结果创建成功,没有乱码。。。也就是说不是系统问题。

想一下,我的php文件本身是utf8编码的,那么

move_uploaded_file($_FILES["file"]["tmp_name"],"upload/测试数据.txt");

这个语句肯定使用的是utf8编码,那么之前上传的文件名肯定就不是utf8编码了,那么以下的语句肯定是错误的,因为源字符串本身就不是utf8编码的:

iconv("UTF-8","gbk//TRANSLIT",$_FILES["file"]["name"]);

使用函数检查源字符串的编码:

$e=mb_detect_encoding($text, array(‘UTF-8', ‘GBK','gb2312'));

echo $e;

结果是CP936,也就是源字符串编码是GBK。

试一下

move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . iconv("gbk","UTF-8",$_FILES["file"]["name"]));

问题解决,不再乱码

4.另一种解决办法

实际上还有一种解决办法,就是在html文件的head标签中间加入

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

从而使编码保持统一,也就不需要再转码了

5.下面是结论

使用iconv函数可以解决上传中文文件名乱码的问题,实际上iconv能解决各种各样的由于编码不统一造成的乱码问题。
使用iconv函数请先检查源字符串的编码,除非你已经确定了源字符串的编码。
尽量保证所有的代码的编码一致,万不得已才使用iconv函数。
吐槽一下,尽量不使用中文文件名作为服务器上保存的文件名,请将文件名转化成自己的文件名(即使是英文文件名也请转化一下)。

PHP 相关文章推荐
一个简单的PHP投票程序源码
Mar 11 PHP
PHP实现多图片上传类实例
Jul 26 PHP
PHP中的Streams详细介绍
Nov 12 PHP
php简单实现快速排序的方法
Apr 04 PHP
PHP中trim()函数简单使用指南
Apr 16 PHP
PHP翻页跳转功能实现方法
Nov 30 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
php实现的mongoDB单例模式操作类
Jan 20 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
laravel 框架实现无限级分类的方法示例
Oct 31 PHP
PHP执行普通shell命令流程解析
Aug 24 PHP
PHP7新增函数
Mar 09 PHP
php上传文件常见问题总结
Feb 03 #PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 #PHP
php对象在内存中的存在形式分析
Feb 03 #PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 #PHP
php格式化金额函数分享
Feb 02 #PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
Feb 02 #PHP
php生成唯一的订单函数分享
Feb 02 #PHP
You might like
基于PHP创建Cookie数组的详解
2013/07/03 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
Yii2中简单的场景使用介绍
2017/06/02 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
通过js获取div的background-image属性
2013/10/15 Javascript
JavaScript中setInterval的用法总结
2013/11/20 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
[00:14]护身甲盾
2019/03/06 DOTA
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
Python3使用requests发闪存的方法
2016/05/11 Python
对pandas中Series的map函数详解
2018/07/25 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
Numpy数组的广播机制的实现
2020/11/03 Python
基于CSS3特效之动画:animation的应用
2013/05/09 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
2014年助理政工师工作总结
2014/12/19 职场文书
检察院起诉意见书
2015/05/20 职场文书
mysql查询结果实现多列拼接查询
2022/04/03 MySQL
Pandas 数据编码的十种方法
2022/04/20 Python