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

问题描述 投票:140回答:12

[尝试在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):无法打开流:在/var/www/html/mysite/process.php的第78行,权限被拒绝]

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

您可以看到,它从未从php.ini文件中获取关于上传文件的配置。

我在这里做错了什么?

php upload file-permissions
12个回答
183
投票

这是因为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指令。


3
投票

只需将tmp_file_upload的权限更改为755以下是命令chmod -R 755 tmp_file_upload


3
投票

解决方案非常简单。仅右键单击IMAGE(目标)文件夹,转到属性,单击权限选项卡,然后将其他访问权限更改为创建和删除文件


2
投票

尝试一下

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664


74
投票

您也可以运行此脚本来查找Apache进程所有者:

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

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

chown user destination_dir

然后使用命令

chmod 755 destination_dir

更改目标目录权限。


18
投票

如果您使用的是Mac OS X,请转到文件根目录或网站的文件夹。

然后右击它,获取信息,移至最底端(共享和权限),将其打开,将所有只读更改为读写。确保打开挂锁,转到设置图标,然后选择Apply到随附的项目...


12
投票

我想将此添加到以前的建议中。如果您使用的Linux版本启用了SELinux,则还应该在shell中执行此操作:

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

以及通过组或更改目录所有者来授予Web服务器用户权限。


11
投票

更改此文件夹的权限

# chmod -R 0755 /var/www/html/mysite/images/


11
投票

这对我有用。

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

然后注销或重新启动。

[如果SELinux投诉,请尝试以下操作

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'

7
投票

尝试一下:

  1. 打开/ etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
    
  2. www-data替换your_username

    "export APACHE_RUN_USER=www-data" 
    

    替换为

    export APACHE_RUN_USER='your_username' 
    

7
投票

即使已经成功运行composer,我也遇到了这个相关问题。我更新了作曲家,并且在运行composer installphp composer.phar install时得到:

...打开流失败:权限被拒绝...

经过大量研究后发现,先前有关更改文件夹权限的答案有效。现在它们只是稍微不同的目录。

在我的安装中,在OS X上,缓存文件位于/Users/[USER]/.composer/cache中,由于缓存文件归root用户所有,因此我遇到了麻烦。以递归方式将“ .composer”的所有权更改为我的用户可以解决此问题。

这是我做的:

sudo chown -R [USER] cache

然后我再次运行作曲家安装,瞧!


5
投票

当apache用户(www-data)没有写文件夹权限时,会发生此问题。要解决此问题,您需要将用户放入组www-data中。

我刚刚做了这个:

执行此php代码<?php echo exec('whoami'); ?>,以发现apache使用的用户。之后,在终端中执行命令:

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

它将返回类似这样的内容:

total of files

drwxr-xr-x 7 user group size date folder

我保留了用户,但将组更改为www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
© www.soinside.com 2019 - 2024. All rights reserved.