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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
php visitFile()遍历指定文件夹函数
Aug 21 PHP
php array_walk() 数组函数
Jul 12 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
Jun 20 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
php生成静态页面的简单示例
Apr 17 PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 PHP
PHP 读取和编写 XML
Nov 19 PHP
php中static和const关键字用法分析
Dec 07 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
详解php与ethereum客户端交互
Apr 28 PHP
Laravel数据库读写分离配置的方法
Oct 13 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
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
用javascript控制iframe滚动的代码
2007/04/10 Javascript
List the Codec Files on a Computer
2007/06/18 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
2018/04/07 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
如何实现jdbc性能优化
2012/07/30 面试题
会计出纳岗位职责
2013/12/25 职场文书
出纳员岗位职责
2014/03/13 职场文书
《忆江南》教学反思
2014/04/07 职场文书
国王的演讲观后感
2015/06/03 职场文书
行政处罚决定书
2015/06/24 职场文书
运动会宣传语
2015/07/13 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书