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的面试题集
Nov 19 PHP
一段php加密解密的代码
Jul 16 PHP
PHP中ADODB类详解
Mar 25 PHP
php获取文件大小的方法
Feb 26 PHP
ThinkPHP3.1新特性之内容解析输出详解
Jun 19 PHP
PHPer 需要了解的 5 个 Composer 小技巧
Aug 18 PHP
php实现cookie加密的方法
Mar 10 PHP
postfixadmin忘记密码后的修改密码方法详解
Jul 20 PHP
PHP  Yii清理缓存的实现方法
Nov 10 PHP
利用PHP获取网站访客的所在地位置
Jan 18 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
php引用传递
Apr 01 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
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
javascript some()函数用法详解
2014/11/13 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
js中生成map对象的方法
2014/01/09 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
django ajax json的实例代码
2018/05/29 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
商场父亲节活动方案
2014/08/27 职场文书
工程质检员岗位职责
2015/04/08 职场文书
不同意离婚答辩状
2015/05/22 职场文书
地道战观后感2000字
2015/06/04 职场文书
运动会200米广播稿
2015/08/19 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python