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中for循环语句的几种变型
Mar 16 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
PHP数组相关函数汇总
Mar 24 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
ThinkPHP的常用配置选项汇总
Mar 24 PHP
php实现36进制与10进制转换功能示例
Jan 10 PHP
PHP 中使用ajax时一些常见错误总结整理
Feb 27 PHP
PHP压缩图片功能的介绍
Mar 21 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
May 09 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 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
用Socket发送电子邮件
2006/10/09 PHP
浅析php变量修饰符static的使用
2013/06/28 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
Python中无限元素列表的实现方法
2014/08/18 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
Python龙贝格法求积分实例
2020/02/29 Python
python 实现两个线程交替执行
2020/05/02 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
高中英语教学反思
2014/02/04 职场文书
售后服务承诺函格式
2015/01/21 职场文书
学校会议通知范文
2015/04/15 职场文书
建党伟业的观后感
2015/06/01 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
Javascript的promise,async和await的区别详解
2022/03/24 Javascript