php上传中文文件名随机码问题处理方案
下面是问题代码,非常简单:
1。问题代码
HTML的一部分:
复制代码代码如下所示:
<形式行动=upload_file .phpmethod=后
enctype =多部分/表单数据>
文件名:
PHP的一部分:
复制代码代码如下所示:
< PHP
如果($ _files { 文件
{
返回代码:。_files美元{ 文件
}其他
{
回声上传:文件 _files美元{
回声型:_files美元{文件
回声($ _files {大小:。文件
临时文件。_files美元{ 文件
如果(file_exists(上传 / $ _files {。文件
{
_files { echo $ 文件
}
其他的
{
move_uploaded_file($ _files { 文件
上载。_files美元{ 文件
}
}
上传一个名为测试数据的文件,呵呵,文件是通过了,但是文件名是随机代码。
2。初步测试
在线搜索解决方案,以及
复制代码代码如下所示:
move_uploaded_file($ _files { 文件
改变
复制代码代码如下所示:
move_uploaded_file($ _files { 文件
发现iconv函数的返回值为false。
检查函数手册,发现二参数有特殊的用法,在编码简单的翻译,我可以追加 / / / /直译或忽略,前者不会翻译成最接近的人物性格,后者是字符不能直接转化忽略。
想去 uff1a
复制代码代码如下所示:
var_dump(iconv(UTF-8
var_dump(iconv(UTF-8
结果uff1a
Bool(假)的字符串(4).txt
也就是说,中国人是不能转化的,甚至连文字的连接都不是,似乎网上介绍的方法不是万能的。
三.联机导入方法失败,再试一次
想,也许我的系统将把创建一个中文文件的时候,所以我重写了代码:
复制代码代码如下所示:
move_uploaded_file($ _files { 文件
结果是成功的,没有随机代码,也就是说,它不是一个系统问题。
想想,我的PHP文件本身是UTF8编码,所以
复制代码代码如下所示:
move_uploaded_file($ _files { 文件
这句话是一定要使用UTF8编码。上传之前绝对不是utf8编码的文件名。以下说法绝对是错误的,因为源字符串本身不是UTF8编码。
复制代码代码如下所示:
iconv(UTF-8
使用函数检查源字符串的编码:
复制代码代码如下所示:
E = mb_detect_encoding美元($文本、阵列('utf-8 ',' GBK,'gb2312);
回声E;
其结果是cp936,即字符串编码的源是GBK。
想去
复制代码代码如下所示:
move_uploaded_file($ _files { 文件
问题解决,不再有随机代码
4。另一个解决方案
事实上,在HTML文件的头标记中间有一个解决方案。
复制代码代码如下所示:
为了保持代码的统一,它不需要重新编码。
5。以下是结论
iconv函数的使用可以解决上传中文文件名乱码的问题。事实上,iconv可以解决所有问题的编码不一致造成的乱码。
使用iconv函数来检查源字符串的第一个代码,除非你已经确定的源字符串的编码。
要确保所有的编码,不使用iconv函数。
至于Tucao,请不要使用中文文件名作为保存在服务器上的文件名。请将文件名转换为自己的文件名(即使英文文件名也被翻译)。