PHP 上传文件 move_uploaded_file 报错

错误内容:

“Warning : move_uploaded_file(绝对路径/供应商资料.xlsx): failed to open stream: Invalid argument”

试了下传数字和字母,成功!于是考虑了当前是在windows下开发,windows下的默认编码是gb2312,
所以需要将文件名的编码格式转了。

(转)http://blog.csdn.net/candyguy242/article/details/20732601

在上传文件后,一般都会用 move_uploaded_file() 进行文件移动改名。但是 move_uploaded_file() 并不支持 UTF-8 编码,如果含有,那么函数就会执行失败,但是这个函数是支持 GB2312 或者是 GBK 编码的,因此可以利用 iconv() 函数先进行名字转换来来解决问题。有两种情况:1. 服务器是中文 Windows 环境在服务器是中文 Windows 环境下,由于中文 Windows 系统的编码是 GB2312,那么可以如下使用代码:
[Plain Text]
$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 种情况。

  1. 服务器是 Linux 系统
    如上面所讲,利用 move_uploaded_file() 函数支持 GBK 的特性,那么我们可以利用再次转换的小技巧使上传的文件名中含有中文的文件在 Linux 下也能正常显示中文名称,如下面代码所示:
    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 "upload ok
    ";
    }
    else
    {
    echo "upload failed";
    }
    ?>
运行输出:

<1> 上传一个文件名中含有中文的文件:
<2> 检查在 Linux 下是否正常显示:正常。

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

你可能感兴趣的:(PHP 上传文件 move_uploaded_file 报错)