Move _ load _ file 给出“未能打开流: 拒绝权限”错误

在 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 _ load _ file (images/robot.jpg) : 未能打开流: 在第78行的/var/www/html/mysite/process.php 中拒绝权限

警告: move _ load _ file () : 无法在第78行中将“/tmp/phpsKD2Qm”移动到“ images/robot.jpg”

正如您所看到的,它从来没有从 php.ini 文件获取关于上载文件的配置。

我做错了什么?

564612 次浏览

试试这个

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

更改此文件夹的权限

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

这是因为 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 images and tmp_file_upload now to be writable by the owner, if needed [Seems you already have this in place]. Mentioned in @Dmitry Teplyakov answer.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
    
  4. For more details why this behavior happend, check the manual http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , note that it also talking about open_basedir directive.

只需将 tmp _ file _ load 的权限更改为755 下面是命令 Chmod-R 755 tmp _ file _ load

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

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

然后将目标目录的所有者更改为您已经得到的内容:

chown user destination_dir

然后使用命令

chmod 755 destination_dir

更改目标目录权限。

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

未能开放河流,请求被拒绝。

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

在我的安装中,在 OS X 上,缓存文件在 /Users/[USER]/.composer/cache中,我遇到了一些问题,因为缓存文件属于 root 用户。更改’的所有权。作曲家递归给我的用户解决了这个问题。

我就是这么做的:

sudo chown -R [USER] cache

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

试试这个:

  1. Open/etc/apache2/envars

    sudo gedit /etc/apache2/envvars
    
  2. replace www-data with your your_username

    "export APACHE_RUN_USER=www-data"
    

    用... 代替

    export APACHE_RUN_USER='your_username'
    

当 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

如果你使用的是 MacOSX 系统,请访问网站的文件根目录或文件夹。

然后右键单击它,去获取信息,去最底部(分享及许可) ,打开它,改变所有只读的读和写。确保打开挂锁,进入设置图标,并选择 申请到封闭的项目..。

这招对我很管用。

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(/.*)?'

我想在之前的建议中加上这一点。如果您正在使用启用了 SELinux的 Linux 版本,那么您也应该在 shell 中执行该命令:

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

同时通过组或更改目录的所有者授予 Web 服务器用户权限。

解决方法很简单。只需右键单击 IMAGE (目标)文件夹,转到属性,单击权限选项卡,并更改其他人对 创建和删除文件的访问。

如果启用了 SELinux,就会发生这种情况。在 /etc/selinux/config中,通过设置 SELINUX=disabled禁用它,然后重新启动服务器。

我已经尝试了以上所有的解决方案,但下面的解决了我的问题

chcon -R -t httpd_sys_rw_content_t your_file_directory