ChatGPT解决这个技术问题 Extra ChatGPT

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():无法将“/tmp/phpsKD2Qm”移动到第 78 行 /var/www/html/mysite/process.php 中的“images/robot.jpg”

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

我在这里做错了什么?

775?也许您的服务器没有人运行。在这种情况下,只有 root 可以写入(您的“图像”权限)...
这是什么意思 ?我怎样才能改变它?
请记住,所有父目录也需要具有正确的权限。

M
Machavity

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

检查 apache 进程所有者:$ps aux | grep httpd。第一列将是所有者,通常是 nobody 将图像的所有者和 tmp_file_upload 更改为 none 或您在步骤 1 中找到的任何所有者。 $sudo chown nobody /var/www/html/mysite/images/ $sudo chown nobody /var/www/html/mysite/tmp_file_upload/ chmod images 和 tmp_file_upload 现在可以由所有者写入,如果需要的话[似乎你已经有了这个]。在@Dmitry Teplyakov 的回答中提到。 $ sudo chmod -R 0755 /var/www/html/mysite/images/ $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/ 有关此行为发生原因的更多详细信息,请查看手册 http://php .net/manual/en/ini.core.php#ini.upload-tmp-dir ,注意它也谈论 open_basedir 指令。


谢谢:我们的老主人曾经是守护进程,现在是 apache
此修复适用于您可能将服务器 php 类型从 fast_CGI、CGI 更改为 Apache_mod 作为 plesk 等的情况。可以继续使用原始用户的权限而不是 apache。这解决了我的问题。
我遇到了同样的错误,但进程和文件夹都归 jacob 所有(因为它是我的本地计算机),并且文件夹都有 755775
更改权限后,我不得不重新启动我的 apache 进程 sudo service httpd restart。然后它起作用了 :) 我没有更改所有者 chown,而是将我的 apache 进程添加到“www”组,并通过 chgrp 将这些目录添加到同一个“www”组
P
Peter Mortensen

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

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

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

chown user destination_dir

然后使用命令

chmod 755 destination_dir

更改目标目录权限。


谢谢它对我有用。我第一次使用 Laith Shadeed 的方法,但在输入 ps aux | 时没有得到相同的结果。 grep httpd<?php echo exec('whoami'); ?>。有谁知道为什么?
ps辅助| grep https 不返回 Web 服务器所有者名称。这样做:ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root |头-1 | cut -d\ -f1 Fron Symfony 文档。
请注意,在上面的命令中,“-d\”和“-f1”之间应该有两个空格。如果您按原样复制粘贴,您可能会收到类似“cut: bad delimiter”的错误。
exec('whoami') 加 1。又为我节省了 30 分钟。正在吃 ubuntu 用户
这应该是 www-data 吗? 通常
J
Junius L.

这对我有用。

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

救了我的命:).. 我使用 GIT post-recive hook 来部署我的 web,每次部署时我都会收到他的权限被拒绝错误,将 git 用户添加到 www-data 修复了它:) 谢谢
这是最好的答案。
不用担心!您的回答是我们心中最好的。你刚刚救了我的命,我不知道该怎么说谢谢!!!!
P
Peter Mortensen

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

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


当他的问题是关于 Linux 系统时,你为什么要评论 Mac OS?
嗨,霍卡,感谢您的回复。我在mac上,你的回答解决了我的问题。非常感谢。
喜欢这个答案
@Kmeixner 这个关于 Linux 的问题,但我在我的 OSX 上遇到了完全相同的问题。感谢您在我的 Mac 上更改文件夹 /private/var/tmp 中的书写选项后,它对我有用。
这是一篇较旧的帖子,但这正是我需要做的。谢谢
P
Peter Mortensen

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

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

除了通过组或更改目录所有者来授予您的 Web 服务器用户权限。


restorecon -R -v /path/to/your/directory 之后可能还需要包含在其中。 access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
很可能是真的,但我假设 chcon “改变了上下文”,即它只是改变了。您正在查看的内容首先使用“semanage fcontext”,将其放入一些设置文件“file_contexts.local”,但它永远不会改变上下文。
@Chris,谢谢伙计。这解决了我的问题。你能说明一下这件事吗?这个命令实际上做了什么?我浏览了手册页甚至 chcon 的信息,但没有找到您输入的类型的值。我在这里有点困惑。
它使 Web 服务器 (httpd) 可以读取目录或文件...老实说,我不想也可能无法解释 selinux,因为我自己几乎不了解它...请参阅 nsa.gov/what-we-do/research/selinux/documentationaccess.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
D
Dmitry Teplyakov

更改此文件夹的权限

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


现在是不是像这样:drwxrwxr-x 2 root root 4096 Nov 11 10:01 图片也在:drwxrwxr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload 但仍然是同样的错误
r
rink.attendant.6

尝试这个:

打开 /etc/apache2/envvars sudo gedit /etc/apache2/envvars 将 www-data 替换为 your_username “export APACHE_RUN_USER=www-data” 替换为 export APACHE_RUN_USER='your_username'


重新启动 Apache ($ sudo service apache2 restart) 以查看 <?php echo exec('whoami'); ?> 中的效果
P
Peter Mortensen

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

...无法打开流:权限被拒绝...

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

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

这就是我所做的:

sudo chown -R [USER] cache

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


J
Jefferson Romano

当 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

P
Peter Mortensen

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


最快的方式但是,只有您使用 GUI 进行 FTP 传输(FileZilla,WinSCP)
S
Sarang

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


S
Simone

尝试这个

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


得到:chmod:在“664”之后缺少操作数
S
Srihari Karanth

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


M
Mithun Sarker Shuvro

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

chcon -R -t httpd_sys_rw_content_t your_file_directory

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅