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模板技术原理【一】
Jan 10 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
Apr 28 PHP
深入php 正则表达式的学习探讨
Jun 06 PHP
php实现的Cookies操作类实例
Sep 24 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
PHP实现的json类实例
Jul 28 PHP
php正则表达式学习笔记
Nov 13 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
Mar 21 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
PHP实现生成模糊图片的方法示例
Dec 21 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
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
php实现可逆加密的方法
2015/08/11 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
javascript preload&amp;lazy load
2010/05/13 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
用Python写的图片蜘蛛人代码
2012/08/27 Python
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
python列表推导式入门学习解析
2019/12/02 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
生产现场工艺工程师岗位职责
2013/11/28 职场文书
办公室文书岗位职责
2013/12/16 职场文书
二年级语文教学反思
2014/02/02 职场文书
2014年质检工作总结
2014/11/26 职场文书
预备党员转正材料
2014/12/19 职场文书
小学重阳节活动总结
2015/03/24 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL