在我完成所有配置后,move_uploaded_file给出"无法打开流:权限被拒绝"错误

use*_*898 138 php linux apache upload

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

在php.ini中:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

无论我做什么,我上传文件时都会从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文件中获取有关上载文件的配置.

我在这做错了什么?

Lai*_*eed 178

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

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

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
    Run Code Online (Sandbox Code Playgroud)
  3. 文件模式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/
    
    Run Code Online (Sandbox Code Playgroud)
  4. 有关此行为发生的更多详细信息,请查看手册http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir,请注意它也在讨论open_basedir指令.

  • 谢谢:我们的老主人已经守护它现在是apache (4认同)
  • 更改权限后,我必须重新启动我的 apache 进程“sudo service httpd restart”。然后它就工作了:)我没有更改所有者`chown`,而是将我的apache进程添加到“www”组,并通过“chgrp”将这些目录添加到同一个“www”组 (2认同)

twl*_*yao 72

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

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

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

chown user destination_dir
Run Code Online (Sandbox Code Playgroud)

然后使用该命令

chmod 755 destination_dir
Run Code Online (Sandbox Code Playgroud)

更改目标目录权限.

  • 这应该是`www-data`吗?*通常* (11认同)
  • 谢谢它适合我.我第一次使用Laith Shadeed的方法但输入**ps aux |时得不到相同的结果 grep httpd**和`<?php echo exec('whoami'); ?>`.有谁知道为什么? (3认同)
  • **ps 辅助 | grep https** 不返回 Web 服务器所有者名称。这样做:**ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v 根| 头-1 | cut -d\ -f1** 前 Symfony 文档。 (2认同)

小智 18

如果您有Mac OS X,请转到文件根目录或您网站的文件夹.

然后右键单击它,去获取信息,转到最底层(共享和权限),打开它,更改所有只读以进行读写.确保打开挂锁,转到设置图标,然后选择应用到随附的项目...

  • 嗨Hawkar,谢谢你的回复.我在Mac上,你的答案解决了我的问题.非常感谢. (7认同)
  • 喜欢这个答案 (2认同)
  • @Kmeixner关于Linux的这个问题,但我在OSX上遇到了完全相同的问题.感谢这条评论,在我更改了Mac上文件夹`/ private/var/tmp`中的写入选项后,它对我有用. (2认同)

Chr*_*ris 12

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

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory
Run Code Online (Sandbox Code Playgroud)

同时通过组或更改目录的所有者为您的Web服务器提供用户权限.


Dmi*_*kov 11

更改此文件夹的权限

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


Jun*_* L. 9

这对我有用.

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www
Run Code Online (Sandbox Code Playgroud)

注销或重启.

如果SELinux抱怨,请尝试以下方法

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'
Run Code Online (Sandbox Code Playgroud)


aba*_*mer 7

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

...未能打开流:权限被拒绝...

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

在我的安装中,在OS X上,缓存文件存在/Users/[USER]/.composer/cache,我遇到了麻烦,因为缓存文件由root拥有.以递归方式向我的用户更改'.composer'的所有权解决了这个问题.

这就是我做的:

sudo chown -R [USER] cache
Run Code Online (Sandbox Code Playgroud)

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


小智 7

试试这个:

  1. 打开/ etc/apache2/envvars

    sudo gedit /etc/apache2/envvars
    
    Run Code Online (Sandbox Code Playgroud)
  2. 替换www-data你的your_username

    "export APACHE_RUN_USER=www-data" 
    
    Run Code Online (Sandbox Code Playgroud)

    用...来代替

    export APACHE_RUN_USER='your_username' 
    
    Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

它将返回如下内容:

total of files

drwxr-xr-x 7 user group size date folder
Run Code Online (Sandbox Code Playgroud)

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

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
Run Code Online (Sandbox Code Playgroud)


小智 5

解决方法很简单。只需右键单击 IMAGE (destination) 文件夹,转到属性,单击权限选项卡,将其他人的访问权限更改为Create and delete files