php 解决 move_uploaded_file() 中文乱码问题

在上传文件后,一般都会用  move_uploaded_file()  进行文件移动改名。但是 move_uploaded_file() 并不支持 UTF-8 编码,如果含有,那么函数就会执行失败,但是这个函数是支持 GB2312 或者是 GBK 编码的,因此可以利用 iconv() 函数先进行名字转换来来解决问题。有两种情况:

1. 服务器是中文 Windows 环境
在服务器是中文 Windows 环境下,由于中文 Windows 系统的编码是 GB2312,那么可以如下使用代码:
[Plain Text]  纯文本查看  复制代码
?
1
2
$upload_file = iconv("UTF-8", "GB2312", $_FILES["myfile"]["name"]);
move_uploaded_file($_FILES["myfile"]["tmp_name"], $upload_file)

上面代码的意思是,先用 iconv() 函数对上传文件名转换为 GB2312 码(上传的文件名若含有中文,那么使用 UTF-8 编码),然后再进行 move_uploaded_file() 改名。这样在中文系统下就可以正常显示了。但是 Linux 系统本身就是使用 UTF-8 来编码的,因此想要在 Linux 下正常显示中文,那么就再次 iconv() 转换一下,这是下面所说的第 2 种情况。

2. 服务器是 Linux 系统
如上面所讲,利用 move_uploaded_file() 函数支持 GBK 的特性,那么我们可以利用再次转换的小技巧使上传的文件名中含有中文的文件在 Linux 下也能正常显示中文名称,如下面代码所示:
[PHP]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
<?php
         $upload_file = iconv( "UTF-8" , "GBK" , $_FILES [ "myfile" ][ "name" ]);   //先转换名字为 GBK 编码
         if (move_uploaded_file( $_FILES [ "myfile" ][ "tmp_name" ], $upload_file )) {
                 $res_file = iconv( "GBK" , "UTF-8" , $upload_file );    // 再从 GBK 转为 UTF-8
                 rename( $upload_file , $res_file );   // 重命名一下文件
                 echo "<strong>upload ok</strong><hr>" ;
         } else {
                 echo "upload failed" ;
         }
 
?>

运行输出:
<1> 上传一个文件名中含有中文的文件:

<2> 检查在 Linux 下是否正常显示:

正常。


解决 move_uploaded_file() 中文乱码问题
http://www.groad.net/bbs/thread-7179-1-1.html
(出处: 曲径通幽论坛)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值