Warm tip: This article is reproduced from serverfault.com, please click

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

(php - move_uploaded_file gives "failed to open stream: Permission denied" error)

发布于 2011-11-12 10:27:06

当尝试在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.php中无法将'/ tmp / phpsKD2Qm'移动到'images / robot.jpg'

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

我在这里做错了什么?

Questioner
user63898
Viewed
11
2017-08-22 20:25:19

这是因为imagestmp_file_upload只能由root用户写入为了使上传正常工作,我们需要使这些文件夹的所有者与httpd进程所有者相同,或者使其在全局范围内可写(错误做法)。

  1. 检查apache进程所有者:$ps aux | grep httpd第一列通常是所有者nobody
  2. 更改你的所有者imagestmp_file_upload要成为的所有者,nobody更改你在步骤1中找到的所有者。

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. Chmod imagestmp_file_upload现在可以由所有者写(如果需要的话)[好像你已经准备好了]。在@Dmitry Teplyakov答案中提及。

    $ 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指令。