PHP move_uploaded_file 失败且没有错误

标签 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";}
?>

原始文件、临时文件和目标已正确设置。但是,返回 Failed

enter image description here

将以下内容添加到 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(所有人都可以读、写、执行)。仍然没有返回错误。

enter image description here

最佳答案

为了防止其他人遇到这个问题,我想分享我的发现。我能够断定这是 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/

相关文章:

php - Facebook JS SDK & PHP SDK 无需刷新?

linux - 异步连接和断开与 epoll (Linux)

ubuntu - 使用 nginx 1.8.0、drupal 7 站点工作配置在 Ubuntu 14.04 上设置 SSL?

nginx - 通过 kubernetes nginx 连接到 gRPC 服务

php - Nginx 无法与 uwsgi 对话(连接过早关闭)

php - 保持登录状态 php 函数

php - MySQL - 如果另一个表中不存在记录,则更新表

javascript - 语法错误 : unterminated string literal var address = "

asp.net - 如何从 Linux (CentOS 7.1) 中删除以前版本的 .NET Core

linux - 如何让 `MANPATH=~/.nmap/doc man 1 nmap` 寻找 nmap.1?