在 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";}
?>
原始文件、临时文件和目标已正确设置。但是,返回 Failed。
将以下内容添加到 Stage2.php 返回 0。引用 PHP Manual , 0表示“没有错误,文件上传成功。”
$_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(所有人都可以读、写、执行)。仍然没有返回错误。
最佳答案
为了防止其他人遇到这个问题,我想分享我的发现。我能够断定这是 Linux CentOS 的问题,而不是 PHP 的问题。
通常,open_basedir
将在 /etc/php.ini
中设置为 /var/www
。在这种情况下,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 来确定 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 上传文件了。
关于PHP move_uploaded_file 失败且没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44228656/