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.ini中文版
Oct 09 PHP
php 高效率写法 推荐
Feb 21 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
Apr 24 PHP
PHP CURL 多线程操作代码实例
May 13 PHP
php使用array_search函数实现数组查找的方法
Jun 12 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
Mar 31 PHP
Yii多表联合查询操作详解
Jun 02 PHP
PHP读书笔记_运算符详解
Jul 01 PHP
php基于openssl的rsa加密解密示例
Jul 11 PHP
Python中使用django form表单验证的方法
Jan 16 PHP
PHP Trait功能与用法实例分析
Jun 03 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对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
JsRender for object语法简介
2014/10/31 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
JSON对象 详解及实例代码
2016/10/18 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
react-native使用leanclound消息推送的方法
2018/08/06 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
Python简单实现区域生长方式
2020/01/16 Python
Python二元算术运算常用方法解析
2020/09/15 Python
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
班级文化标语
2014/06/23 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
就业意向书范本
2015/05/11 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python