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 分页类 扩展代码
Jun 11 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
Feb 16 PHP
PHP 文件上传全攻略
Apr 28 PHP
PHP面向对象法则
Feb 23 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
解析php file_exists无效的解决办法
Jun 26 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
php中判断数组相等的方法以及数组运算符介绍
Mar 30 PHP
Smarty简单生成表单元素的方法示例
May 23 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 PHP
Yii框架的redis命令使用方法简单示例
Oct 15 PHP
PHP 实现缩略图
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伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
PHP正则表达式入门教程(推荐)
2016/05/18 PHP
PHP创建单例后台进程的方法示例
2017/05/23 PHP
mysqli扩展无法在PHP7下升级问题的解决
2019/09/10 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
js的onload事件及初始化按钮事件示例代码
2013/09/25 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
javascript基础知识讲解
2017/01/11 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
小程序实现投票进度条
2019/11/20 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
python爬取NUS-WIDE数据库图片
2016/10/05 Python
Python遍历numpy数组的实例
2018/04/04 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
亚马逊印度站:Amazon.in
2017/10/15 全球购物
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
总经理驾驶员岗位职责
2013/12/04 职场文书
企业门卫岗位职责
2013/12/12 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
机关保密工作承诺书
2015/05/04 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
sql注入教程之类型以及提交注入
2021/08/02 MySQL
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python