PHP fopen():文件名不能为空,因为getRealPath返回false
我正在本地使用Laragon在Windows10上开发Laravel项目 PHP版本:7.1.8 64位NTS 我知道的相关php.ini是 立柱最大尺寸=8M 文件上传=打开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->
源代码:
// 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进行测试,但忘了将其更改回来。