move_uploaded_file返回false,但$ _FILES错误为0

时间:2019-06-09 15:56:19

标签: php linux file-upload upload

我正在尝试在Linux机器上部署使用CodeIgniter框架构建的PHP项目。

由于某种原因,无法将上传的文件从temp移至指定目录。

信息

  • PHP 7.2.19
  • CentOS 7
  • CodeIgniter 3.0.6

注释

  • 我检查了包含目录的目标是否存在(不存在与待移动文件同名的重复文件)。
  • 我已经检查了目录的权限,应该没问题(我将组设置为apache,权限=所有者用户)
  • 检查了ACL,并且与普通权限一致。
  • $_FILES['file']['error'] = 0(在致电move_uploaded_file之前和之后)
  • file_exists$_FILES['file']['tmp_name']返回true
  • is_uploaded_file$_FILES['file']['tmp_name']返回true
  • open_basedir未设置
  • 上传的文件少于帖子和文件的上传限制。

最后,请提防自己,这是网站的另一个副本存在(部署在具有不同目录名的同一台服务器上),并且上传工作正常。区分这两个目录以捕获不同的目录,但没有找到任何内容(除了一些具有一些更新的视图,没有与配置相关的任何文件,.htacess都如此)。

我应该看什么线索?

更新1

代码:

    $createdFileName = NULL;
    $files = $_FILES;
    if (count($files) > 0) {
        $createdFileName = $this->GUID();
        $target_file = './upload/' . $createdFileName;
        $path_info = pathinfo($files["file"]["name"]);
        if (isset($path_info['extension'])) {
                $ext = $path_info['extension'];
        } else /*if (!$ext)*/ {
            $ext = substr($files['file']['type'], strrpos($files['file']['type'], '/') + 1);
        }
        $success = move_uploaded_file($files["file"]["tmp_name"], $target_file);
        if (!$success) {
            $result = json_encode(array('result' => FALSE, 'message' => 'Couldn\'t upload image file'));
        }
    }

这是与其他项目一起使用的代码,而不与我正在处理的项目一起使用。

我通过远程调试项目了解了error和其他值。

更新2

以下是上传目录的权限。

drwxrwxr-x. 2 demoroot apache 4.0K Jun  9 14:06 upload/

以下是getfacl的输出:

# file: upload/
# owner: demoroot
# group: apache
user::rwx
group::rwx
other::r-x

1 个答案:

答案 0 :(得分:0)

该解决方案正在运行以下命令

chcon -R --type httpd_sys_rw_content_t /path/to/upload/directory

我完全不知道它的作用以及为什么在getfacl输出看起来还不错而又不运行命令的情况下必须运行它。