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实现的下载css文件中的图片的代码
Feb 08 PHP
php HtmlReplace输入过滤安全函数
Jul 03 PHP
PHP学习笔记之二
Jan 17 PHP
YII中assets的使用示例
Jul 31 PHP
php在数据库抽象层简单使用PDO的方法
Nov 03 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
Mar 17 PHP
深入理解PHP原理之执行周期分析
Jun 01 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
PHP中的use关键字及文件的加载详解
Nov 28 PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 PHP
PHP封装的分页类与简单用法示例
Feb 25 PHP
Laravel自动生成UUID,从建表到使用详解
Oct 24 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数据采集的详解
2013/06/02 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
vue中echarts3.0自适应的方法
2018/02/26 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
跟老齐学Python之类的细节
2014/10/13 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
Pytorch之parameters的使用
2019/12/31 Python
python ubplot使用方法解析
2020/01/10 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
房地产促销活动方案
2014/03/01 职场文书
党员目标管理责任书
2014/07/25 职场文书
单位委托书怎么写
2014/08/02 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
公司回复函格式
2015/07/14 职场文书
争做文明公民倡议书
2019/06/24 职场文书
Nginx配置根据url参数重定向
2022/04/11 Servers
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL