PHP fopen():文件名不能为空,因为getRealPath返回false

PHP fopen():文件名不能为空,因为getRealPath返回false,php,laravel,Php,Laravel,我正在本地使用Laragon在Windows10上开发Laravel项目 PHP版本:7.1.8 64位NTS 我知道的相关php.ini是 立柱最大尺寸=8M 文件上传=打开 源代码: // if no image uploaded if (!$request->hasFile('profile_picture')) throw new \Exception("No image found"); // get uploaded image $image = $request->

我正在本地使用Laragon在Windows10上开发Laravel项目

PHP版本:7.1.8 64位NTS

我知道的相关php.ini是

立柱最大尺寸=8M

文件上传=打开


源代码:

// if no image uploaded
if (!$request->hasFile('profile_picture')) 
throw new \Exception("No image found");

// get uploaded image
$image = $request->file('profile_picture');

// store to storage/app/users/
Storage::putFileAs('users', $image ,auth()->id());

在我看来,这是服务器配置问题,可能是php.ini上的问题

但我不熟悉服务器配置,而且网上也没有太多与此相关的主题


我知道问题的原因,但不知道如何解决。

您确定运行Web服务器进程用户的用户具有对Windows临时目录的RW(读/写)访问权限吗?如果没有,你肯定会失败

一个可能的修复方法是将PHP TEMP Dir设置为可读/写位置

php.ini上设置此指令

upload\u tmp\u dir
='PATH'

确保“路径”存在,并且您的Web服务器进程用户对其具有读/写访问权限


Web服务器Process User是Web服务器用于运行服务的帐户。您可以在任务管理器上对此进行检查。

您确定运行Web服务器进程用户的用户具有对Windows临时目录的RW(读/写)访问权限吗?如果没有,你肯定会失败

一个可能的修复方法是将PHP TEMP Dir设置为可读/写位置

php.ini上设置此指令

upload\u tmp\u dir
='PATH'

确保“路径”存在,并且您的Web服务器进程用户对其具有读/写访问权限


Web服务器Process User是Web服务器用于运行服务的帐户。您可以在任务管理器上查看这一点。

两天后,我终于找到了原因。上次,我使用PHP-TS(线程安全)版本开发了这个应用程序,它工作正常

现在,我正在使用PHP-NTS(非线程安全)版本,经过测试,我能够确认这个问题是由NTS&TS的不同文件信息结果引起的

对于PHP7.1.7 64位TS

对于PHP7.1.8 64位NTS

所以现在我们可以知道错误发生在临时文件夹设置上

对于NTS版本,C:\Windows\temp上的临时文件夹

没有此文件夹的权限,因为PHP无法读取realPath(我猜),realPath返回false

对于TS版本,C:\Users\YQuan\AppData\Local\temp上的临时文件夹

允许访问,realPath可读

解决方案
  • 更改文件夹的权限已生效

    我不会使用此方法,因为太乱,无法更改Windows系统上的权限

  • 将php.ini中的upload_tmp_dir设置为“C:\Users\{username}\AppData\Local\Temp”,然后重新启动服务器

    这种方法比较简单


  • 两天后,我终于明白了原因。上次,我使用PHP-TS(线程安全)版本开发了这个应用程序,它工作正常

    现在,我正在使用PHP-NTS(非线程安全)版本,经过测试,我能够确认这个问题是由NTS&TS的不同文件信息结果引起的

    对于PHP7.1.7 64位TS

    对于PHP7.1.8 64位NTS

    所以现在我们可以知道错误发生在临时文件夹设置上

    对于NTS版本,C:\Windows\temp上的临时文件夹

    没有此文件夹的权限,因为PHP无法读取realPath(我猜),realPath返回false

    对于TS版本,C:\Users\YQuan\AppData\Local\temp上的临时文件夹

    允许访问,realPath可读

    解决方案
  • 更改文件夹的权限已生效

    我不会使用此方法,因为太乱,无法更改Windows系统上的权限

  • 将php.ini中的upload_tmp_dir设置为“C:\Users\{username}\AppData\Local\Temp”,然后重新启动服务器

    这种方法比较简单


  • 感谢您的快速回复,我已经检查过了,身份验证是通过的,id返回1(用户id)对于那些对这个问题投反对票的人,我可以知道为什么吗?也许对“批评家”投反对票badge@MiSAKACHi你能解释一下吗?我不熟悉stackoverflow的规则看这里。。。感谢您的快速回复,我已经检查过了,身份验证是通过的,id返回1(用户id)对于那些对这个问题投反对票的人,我可以知道为什么吗?也许对“批评家”投反对票badge@MiSAKACHi你能解释一下吗?我不熟悉stackoverflow的规则看这里。。。是的,你的回答给了我解决问题的灵感。谢谢你们谢谢,答案很有帮助。Windows®服务器的Internet信息服务(IIS)出现此问题。唯一需要的是C:\Windows\temp的-permission,因为它在php7的php.ini中被设置为upload\u tmp\u dir。谢谢是的,你的回答给了我解决问题的灵感。谢谢你们谢谢,答案很有帮助。Windows®服务器的Internet信息服务(IIS)出现此问题。唯一需要的是C:\Windows\temp的-permission,因为它在php7的php.ini中被设置为upload\u tmp\u dir。谢谢谢谢你让我花了很多时间,我从7.2 TS切换到7.1-nts进行测试,但忘了将其更改回来。谢谢你让我花了很多时间,我从7.2 TS切换到7.1-nts进行测试,但忘了将其更改回来。