php上传中文文件文件名乱码有关问题

php中文网
发布: 2016-06-13 12:14:30
原创
968人浏览过

php上传中文文件文件名乱码问题

php上传文件是最最基础的一个技术点,但是深入进去也有不少问题需要解决,这不,上传中文文件后,文件名变成了乱码。

下面是问题代码,很简单:

1.问题代码

html部分:

<span style="color: #008080;"> 1</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #008080;"> 3</span> <span style="color: #008080;"> 4</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">form </span><span style="color: #ff0000;">action</span><span style="color: #0000ff;">="upload_file.php"</span><span style="color: #ff0000;"> method</span><span style="color: #0000ff;">="post"</span><span style="color: #008080;"> 5</span> <span style="color: #ff0000;">enctype</span><span style="color: #0000ff;">="multipart/form-data"</span><span style="color: #0000ff;">></span><span style="color: #008080;"> 6</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">label </span><span style="color: #ff0000;">for</span><span style="color: #0000ff;">="file"</span><span style="color: #0000ff;">></span>Filename:<span style="color: #0000ff;"></</span><span style="color: #800000;">label</span><span style="color: #0000ff;">></span><span style="color: #008080;"> 7</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="file"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="file"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="file"</span> <span style="color: #0000ff;">/></span> <span style="color: #008080;"> 8</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">br </span><span style="color: #0000ff;">/></span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;"><</span><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="submit"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="submit"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="Submit"</span> <span style="color: #0000ff;">/></span><span style="color: #008080;">10</span> <span style="color: #0000ff;"></</span><span style="color: #800000;">form</span><span style="color: #0000ff;">></span><span style="color: #008080;">11</span> <span style="color: #008080;">12</span> <span style="color: #0000ff;"></</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #008080;">13</span> <span style="color: #0000ff;"></</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>
登录后复制

php部分:

 

<span style="color: #008080;"> 1</span> <?<span style="color: #000000;">php</span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$_FILES</span>["file"]["error"] > 0<span style="color: #000000;">)</span><span style="color: #008080;"> 3</span> <span style="color: #000000;">{</span><span style="color: #008080;"> 4</span>     <span style="color: #0000ff;">echo</span> "Return Code: " . <span style="color: #800080;">$_FILES</span>["file"]["error"] . "<br />"<span style="color: #000000;">;</span><span style="color: #008080;"> 5</span> <span style="color: #000000;">}</span><span style="color: #0000ff;">else</span><span style="color: #008080;"> 7</span> <span style="color: #000000;">{</span><span style="color: #008080;"> 8</span>     <span style="color: #0000ff;">echo</span> "Upload: " . <span style="color: #800080;">$_FILES</span>["file"]["name"] . "<br />"<span style="color: #000000;">;</span><span style="color: #008080;"> 9</span>     <span style="color: #0000ff;">echo</span> "Type: " . <span style="color: #800080;">$_FILES</span>["file"]["type"] . "<br />"<span style="color: #000000;">;</span><span style="color: #008080;">10</span>     <span style="color: #0000ff;">echo</span> "Size: " . (<span style="color: #800080;">$_FILES</span>["file"]["size"] / 1024) . " Kb<br />"<span style="color: #000000;">;</span><span style="color: #008080;">11</span>     <span style="color: #0000ff;">echo</span> "Temp file: " . <span style="color: #800080;">$_FILES</span>["file"]["tmp_name"] . "<br />"<span style="color: #000000;">;</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span>     <span style="color: #0000ff;">if</span> (<span style="color: #008080;">file_exists</span>("upload/" . <span style="color: #800080;">$_FILES</span>["file"]["name"<span style="color: #000000;">]))</span><span style="color: #008080;">14</span> <span style="color: #000000;">    {</span><span style="color: #008080;">15</span>         <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$_FILES</span>["file"]["name"] . " already exists. "<span style="color: #000000;">;</span><span style="color: #008080;">16</span> <span style="color: #000000;">    }</span><span style="color: #008080;">17</span>     <span style="color: #0000ff;">else</span><span style="color: #008080;">18</span> <span style="color: #000000;">    {</span><span style="color: #008080;">19</span>       <span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"],<span style="color: #008080;">20</span>       "upload/" . <span style="color: #800080;">$_FILES</span>["file"]["name"]);<br />       }<br />   }
登录后复制

 

上传了一个文件名为“测试数据.txt”的文件,oh ho,文件是传上去了,但是文件名为乱码。

立即学习PHP免费学习笔记(深入)”;

2.初试

网上搜索一下解决方案,将

 

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"], "upload/" . <span style="color: #800080;">$_FILES</span>["file"]["name"]);
登录后复制

改成

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"],"upload/" . <span style="color: #008080;">iconv</span>("UTF-8","gbk",<span style="color: #800080;">$_FILES</span>["file"]["name"]));
登录后复制

 

结果发现iconv函数返回值为false。

查一下函数手册,发现第二个参数有特别的用法,简单翻译一下就是我可以在编码的后面追加//TRANSLIT 或 //IGNORE ,前者会将无法翻译的字符转成最接近的字符,后者就是直接忽略不能转化的字符。

 



试一下:

<span style="color: #008080;">1</span> <span style="color: #008080;">var_dump</span>( <span style="color: #008080;">iconv</span>("UTF-8","gbk//TRANSLIT",<span style="color: #800080;">$_FILES</span>["file"]["name"<span style="color: #000000;">]));</span><span style="color: #008080;">2</span> <span style="color: #008080;">var_dump</span>( <span style="color: #008080;">iconv</span>("UTF-8","gbk//IGNORE",<span style="color: #800080;">$_FILES</span>["file"]["name"]));
登录后复制

结果:

非常淘 淘宝客源码
非常淘 淘宝客源码

本源码是我用过最好的淘客站源码。对于新站长很用帮助。重要!!注意上传完程序后要先登陆后台修改域名,否则会跳转到后台已设置的域名。 使用方法1:将文件夹里面的文件上传至您的空间根目录(不要在本地测试,本地测试期间功能将被限制,首页模板显示不正常!)2:访问网址http://您的网址/admin 账号:admin 密码:admin3:填写您基本网站信息,以及重要的淘客相关信息 声明:本程序使用权是本人

非常淘 淘宝客源码 0
查看详情 非常淘 淘宝客源码
bool(false) string(4) ".txt"

也就是说中文都没法转化,甚至连接近的字符都没有,看来网上介绍的方法也并非万能。

3.网上介绍方法失败,再尝试

猜测一下,也许我的系统在创建中文文件的时候会乱码,于是我将代码改写了一下:

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"], "upload/测试数据.txt");
登录后复制

结果创建成功,没有乱码。。。也就是说不是系统问题。

想一下,我的php文件本身是utf8编码的,那么

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"],"upload/测试数据.txt");
登录后复制

这个语句肯定使用的是utf8编码,那么之前上传的文件名肯定就不是utf8编码了,那么以下的语句肯定是错误的,因为源字符串本身就不是utf8编码的:

<span style="color: #008080;">iconv</span>("UTF-8","gbk//TRANSLIT",<span style="color: #800080;">$_FILES</span>["file"]["name"]);
登录后复制

使用函数检查源字符串的编码:

<span style="color: #008080;">1</span> <span style="color: #800080;">$e</span>=mb_detect_encoding(<span style="color: #800080;">$text</span>, <span style="color: #0000ff;">array</span>(&lsquo;UTF-8&rsquo;, &lsquo;GBK&rsquo;,<span style="color: #000000;">&rsquo;gb2312&rsquo;));</span><span style="color: #008080;">2</span> <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$e</span>;
登录后复制

结果是CP936,也就是源字符串编码是GBK。

试一下

<span style="color: #008080;">move_uploaded_file</span>(<span style="color: #800080;">$_FILES</span>["file"]["tmp_name"],"upload/" . <span style="color: #008080;">iconv</span>("gbk","UTF-8",<span style="color: #800080;">$_FILES</span>["file"]["name"]));
登录后复制

问题解决,不再乱码

4.另一种解决办法

实际上还有一种解决办法,就是在html文件的head标签中间加入

<span style="color: #0000ff;"><</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="Content-Type"</span><span style="color: #ff0000;"> content</span><span style="color: #0000ff;">="text/html; charset=utf-8"</span> <span style="color: #0000ff;">/></span>
登录后复制

从而使编码保持统一,也就不需要再转码了

5.下面是结论

  1. 使用iconv函数可以解决上传中文文件名乱码的问题,实际上iconv能解决各种各样的由于编码不统一造成的乱码问题。
  2. 使用iconv函数请先检查源字符串的编码,除非你已经确定了源字符串的编码。
  3. 尽量保证所有的代码的编码一致,万不得已才使用iconv函数。
  4. 吐槽一下,尽量不使用中文文件名作为服务器上保存的文件名,请将文件名转化成自己的文件名(即使是英文文件名也请转化一下)。

 

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号