我有一个PHP脚本,我可以通过它上传文件,并尝试将其从/tmp移动到test/(相对路径,位于我的项目文件夹中,例如/var/www/html/myproject/test将是绝对路径)。当这种情况发生时,我会收到以下错误。
move_uploaded_file(test/test.csv):无法打开流:权限被拒绝,位于/var/www/html/myproject/import.php的第X行,引用者:http://192.168.1.1/myproject/import2.php
此脚本由apache用户运行,该用户拥有/test的所有权(apache所有者和apache组都拥有此目录),具有rwx权限。
我已经检查了以下内容:
- safe_mode被禁用。
- open_basedir未设置。
- file_uploads已启用。
- upload_max_filesize为2MB,文件大小为~50KB。
- post_max_size为8MB,我的POST请求与此不接近。
- 使用绝对路径而不是相对路径。
- is_dir("test/")返回true。
- is_writable("test/")返回false。
- 在php脚本中:打印文件所有者(要移动的文件)、文件夹所有者(test/)、文件权限和文件夹权限。文件/文件夹所有者显示为apache。文件权限为600,因此所有者可以读取和写入。文件夹权限为755,因此所有者可以读取、写入和执行。
- ps -aux | grep apache。将apache错误日志中的PID与正在运行的进程匹配,该进程由apache用户拥有。因此,这确认了该进程在apache下运行。
- getcwd()和
__DIR__
都返回正确的目录/var/www/html/myproject。
- dirname(
__FILE__
)返回文件的正确绝对路径
- 检查file_exists($_FILES['file']['tmp_name'])返回true
- 检查$_FILES['file']['error'](我要移动的文件)返回0,上传没有问题。
- 使用is_writable("/tmp")检查源文件夹(/tmp)是否可写,返回true。
- 尝试在test/上临时使用chmod -R 777,仍然显示权限被拒绝且不可写。
- 暂时禁用了防病毒/EDR
- 检查“test/”的安全上下文。返回结果为:“unconfined_u:object_r:httpd_sys_content_t:s0”。这些都不是问题(在下面的回复中有解释)。
- 检查是否安装了可能阻止移动文件的安全相关应用程序。这些应用程序未安装:AppArmor、grsecurity、Tomoyo Linux和Smack。
- 在php脚本中使用fopen() / flock()函数确认我要移动的文件没有被锁定。
- 使用is_uploaded_file()函数确认我正在尝试移动一个已上传的文件(在这一点上我已经快疯了,只是尝试我能想到的任何方法)。当然,这返回true。
move_uploaded_file需要两个参数。 1:你想要上传的文件 2:放置文件的绝对路径 3:请确保上传目录具有适当的所有权和权限(注意:如果您使用Apache作为代理,目录所有权应属于apache2的用户:组)。
阅读更多:https://www.php.net/manual/pt_BR/function.move-uploaded-file.php