PHP move_uploaded_file失败,没有错误

时间:2017-05-28 14:56:17

标签: php linux nginx

在LEMP(Linux CentOS,Nginx,MariaDB,PHP)服务器上,/etc/php.ini文件具有以下内容。

file_uploads = on
upload_tmp_dir = /tmp

Stage1.html具有以下标记,用于选择图像文件,并将图像发布到Stage2.php。

<form action="Stage2.php" method="post" enctype="multipart/form-data">
    <input type="file" name="upload">
    <input type="submit">
</form>

Stage2.php具有以下内容。

<?php
    $original_name = $_FILES["upload"]["name"];
    $temporary_name = $_FILES["upload"]["tmp_name"];
    $target = "/var/www/html/images/" . $original_name;

    if(move_uploaded_file($temporary_name, $target)) {echo "Success";}
    else{echo "Failed";}
?>

正确设置原始文件,临时文件和目标。但是,会返回失败

enter image description here

将以下内容添加到Stage2.php会返回0.要引用PHP Manual,0表示&#34;没有错误,文件已成功上传。&#34;

$_FILES["upload"]["error"];

将以下内容添加到Stage2.php不会显示任何错误。这让我怀疑PHP认为一切正常,也许问题是CentOS或Nginx的问题。这是合乎逻辑的假设吗?

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

对于调试,在CentOS中,我将/ tmp和/ var / www / html / images的权限设置为777(读取,写入,执行每个人)。仍然没有错误返回。

enter image description here

2 个答案:

答案 0 :(得分:2)

为了防止其他人遇到这个问题,我想分享我发现的内容。我得出结论这是Linux CentOS的一个问题,而不是PHP问题。

通常,open_basedir将设置为/var/www中的/etc/php.ini。在这种情况下,upload_tmp_dir必须低于/var/www。我将upload_tmp_dir设置为/var/www/html/images/tmp

upload_tmp_dir = /var/www/html/images/tmp

然后我设置临时上传目录的权限是755。

[john.doe@server1 ~]# chmod 755 /var/www/html/uploads/tmp

然后我使用以下PHP来确定用户上传文件的用户。在我的方案中,用户是 apache

<?php
    echo exec('whoami'); 
?>

一旦我确定用户是apache,我就将临时上传目录的所有者设置为apache。

[john.doe@server1 ~]# chown apache:root /var/www/html/uploads/tmp

最后,我必须将临时和永久上传目录的SELinux上下文设置为httpd_sys_rw_content_t

[john.doe@server1 ~]# chcon --type httpd_sys_rw_content_t /var/www/html/uploads
[john.doe@server1 ~]# chcon --type httpd_sys_rw_content_t /var/www/html/uploads/tmp

完成这些操作后,我就可以使用PHP上传文件了。

答案 1 :(得分:0)

在这种情况下,我无法成功上传文件! 只需在终端中运行以下命令

chcon -Rv --type=httpd_sys_rw_content_t /var/www/html/directoryPath

注意:OS centOS 7,Apache2.4.6