在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";}
?>
正确设置原始文件,临时文件和目标。但是,会返回失败。
将以下内容添加到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(读取,写入,执行每个人)。仍然没有错误返回。
答案 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