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实现MySQL更新记录的代码
Jun 07 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
深入php中var_dump方法的使用详解
Jun 24 PHP
浅析php中抽象类和接口的概念以及区别
Jun 27 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
Jan 05 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
Jul 08 PHP
php简单统计中文个数的方法
Sep 30 PHP
php app支付宝回调(异步通知)详解
Jul 25 PHP
tp5.1 框架数据库-数据集操作实例分析
May 26 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
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
浅谈angular.js跨域post解决方案
2017/08/30 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
Python制作CSDN免积分下载器
2015/03/10 Python
详解python中的json的基本使用方法
2016/12/21 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
深入理解Python中的super()方法
2017/11/20 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
Python自定义一个异常类的方法
2019/06/27 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
关于Java String的一道面试题
2013/09/29 面试题
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书