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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在我完成所有配置后,move_uploaded_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_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文件中获取有关上载文件的配置。

我在这做错了什么?

答案

这是因为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指令。
另一答案

试试这个

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

另一答案

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

另一答案

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

另一答案

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

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

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

chown user destination_dir

然后使用该命令

chmod 755 destination_dir

更改目标目录权限。

另一答案

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

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

另一答案

更改此文件夹的权限

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

另一答案

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

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

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

另一答案

这对我有用。

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(/.*)?'
另一答案

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

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

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

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

这就是我做的:

sudo chown -R [USER] cache

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

另一答案

试试这个:

  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'
另一答案

当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

以上是关于在我完成所有配置后,move_uploaded_file给出“无法打开流:权限被拒绝”错误的主要内容,如果未能解决你的问题,请参考以下文章

我在linux下安装squid完成后,squid.conf文件的配置

动画后 UITableViewRowAction 完成

URLSession 下载任务委托仅在所有任务完成后调用

如何再次读取配置文件并更新 Discord 机器人的前缀?

在 JUnit 5 完成所有类测试后,测试容器未从 docker 中删除

在 Windows 中使用 Qt 配置 openCV