登陆 注册

PHP上传文件后文件名乱码的解决方案

守望者 2020-03-21 326人围观 ,发现0个评论 php

此问题经常发生在我们上传中文文件名的文件的时候,上传后的文件名极有可能会发生乱码。


   下面给出 a.html文件和 a.php文件,为了方便测试,我们把两个文件都放在本地同一文件夹下(任意文件夹都可以),

而不再把文件放到服务器上了,当然放上去也可以


    新建 a.html文件,用于上传文件,文件内容如下:

<!DOCTYPE html>
<html>
<head>

    <meta charset="utf-8">
    <title>test</title>

</head>

<body>
    <form method="POST" action="a.php" enctype="multipart/form-data">
    
      <input type="file" name="file">
      <input type="submit" name="submit" value="上传">
    
    </form>
</body>

</html>


    新建 a.php文件,用于处理接收文件,文件内容如下:

<?php
header("content-type:text/html; charset=utf-8");

$fileinfo = $_FILES["file"];
$tmp_name = $fileinfo["tmp_name"];
$filename = $fileinfo["name"];

move_uploaded_file($tmp_name,$filename);

if($fileinfo["error"]==1){
  echo '文件:'.$filename.' 上传完成';
}
else{echo "文件上传失败 error code: "$fileinfo["error"];}
?>


下面我们直接双击打开a.html文件(以浏览器方式打开),选择一个中文文件(软件.exe)并上传

结果上传后的文件名发生了乱码:

PHP 上传后文件名乱码


更有甚者,当我们选择文件名是“安装包.exe”进行上传的时候,直接报错:


PHP 上传文件时控制台报错


     凡此种种,皆是因为php环境的编码和系统编码不一致造成的:

我们php文件的编码是utf-8, 而我们的系统编码是gbk (windows中文系统编码是GBK)

所以只要在调用move_uploaded_file函数前加入如下代码,对文件名进行一次转码就ok了


 $filename1 = iconv("utf-8","GBK",$filename);


这里将utf-8编码转成GBK编码并将转码后的文件名写入系统,发现上传后的文件名恢复正常


注意:


1. 有的小伙伴可能会选择转成“gb2312”,这里我建议选择“GBK”,因为"GBK编码"录入的汉字比“gb2312”更丰富些,

这样不至于碰到一些编码集没有录入的汉字的时候出现不必要的解析问题


2. 网上还有人说只要 html文件 和 php文件选择的是同一种编码集中间就不需要转码,这个是错误的,仍然需要转码


3. 建议html文件 和 php文件都统一指定好编码集"UTF-8",否则转码的时候可能会因为传入的参数与实际情况不符从而造成错误 


    转载请附上本文链接:https://tufeng.xyz/php/23.html,谢谢合作!

请发表您的评论
请关注微信公众号
微信二维码