move_uploaded_file出现“无法打开流:权限被拒绝”错误

2022-08-30 06:36:37

当我尝试在CentOS上使用Apache 2.2和PHP 5.3配置上传目录时,我不断收到此错误。

在 php.ini 中:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

在 httpd.conf 中:

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

CentOS 目录权限:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

无论我做什么,当我上传文件时,我都会从PHP收到这个错误:

警告:move_uploaded_file(images/robot.jpg):无法打开流:在第 78 行的 /var/www/html/mysite/process.php 中的权限被拒绝

警告:move_uploaded_file(): 无法将第 78 行的 /var/www/html/mysite/process 中的 '/tmp/phpsKD2Qm' 移动到 'images/robot.jpg' .php

如您所见,它从未从php.ini文件中获取有关上传文件的配置。

我在这里做错了什么?


答案 1

这是因为并且只能由用户写入。为了使上传工作,我们需要使这些文件夹的所有者与httpd进程所有者相同,或者使它们全局可写(不良做法)。imagestmp_file_uploadroot

  1. 检查 apache 进程所有者:。第一列将是所有者,通常是$ps aux | grep httpdnobody
  2. 更改所有者并成为您在步骤 1 中找到的任何所有者。imagestmp_file_uploadnobody

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. 如果需要,Chmod现在由所有者写入[似乎你已经有了这个]。在@Dmitry中提到的Teplyakov回答。imagestmp_file_upload

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
    
  4. 有关发生此行为的更多详细信息,请查看手册 http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir ,请注意它还在谈论指令。open_basedir


答案 2

您还可以运行此脚本以找出 Apache 进程所有者:

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

然后将目标目录的所有者更改为您拥有的内容。使用以下命令:

chown user destination_dir

然后使用命令

chmod 755 destination_dir

以更改目标目录权限。


推荐