Laravel 5 在IIS 7环境下遇fopen(): Filename cannot be empty错误求助
兄弟,我太懂你这种卡壳一整天的烦躁了!针对你在Windows Server 2008 R2 + IIS7 + NTS PHP环境下遇到的Laravel上传图片时fopen(): Filename cannot be empty问题,结合你已经做的操作,给你几个针对性的排查和解决方向:
确认php.ini修改是否真的生效
很多时候改了php.ini却忘了重启IIS或者PHP相关服务,等于白忙活。你可以在项目根目录新建一个phpinfo.php文件,内容就一行:<?php phpinfo(); ?>访问这个文件后搜索
upload_tmp_dir,看看显示的路径是不是你设置的C:\Windows\Temp。如果不对,先排查是不是改了错误的php.ini(比如Windows下CLI和FastCGI版本可能对应不同的ini文件),改完一定要重启IIS服务让配置生效。检查uploads目标文件夹的权限
你给了Temp目录权限,但Laravel最终要写入的uploads文件夹也不能忽略!找到项目里的uploads文件夹(比如storage/app/uploads),右键→属性→安全,添加IIS_IUSERS用户,给它修改、写入、读取的权限,还要确保这个文件夹的权限继承没有被阻断,有时候父目录的权限限制会影响子文件夹。修正Laravel文件系统的路径配置
开发环境是Mac,但生产环境是Windows,路径分隔符完全不一样!打开config/filesystems.php,检查你用的磁盘配置(比如local磁盘),root路径别用Mac的正斜杠,改用Windows的反斜杠或者PHP的DIRECTORY_SEPARATOR常量适配,比如:'local' => [ 'driver' => 'local', 'root' => storage_path('app' . DIRECTORY_SEPARATOR . 'uploads'), ],另外,确认uploads文件夹确实存在于
storage/app/目录下,Laravel默认不会自动创建不存在的目录,要是没有的话手动创建或者在代码里加Storage::makeDirectory('uploads')。排查上传代码的逻辑漏洞
看看你处理上传的代码是不是没做必要的验证?比如应该先判断上传文件是否存在且有效:if ($request->hasFile('image') && $request->file('image')->isValid()) { // 执行保存操作 $path = $request->file('image')->store('uploads'); }如果跳过了
hasFile和isValid的检查,可能拿到的是空文件对象,自然会导致fopen时文件名为空。排查NTS PHP的运行用户
NTS(非线程安全)版本的PHP在IIS下运行时,有时候会用IUSR用户而不是IIS_IUSERS。你可以试着给C:\Windows\Temp和uploads文件夹也加上IUSR用户的完全控制权限,说不定是运行身份的问题导致权限不足。避开系统对Temp目录的自动清理
有些Windows服务器的安全软件或者系统定时任务会自动清理Temp目录的临时文件,刚好在上传过程中删掉了临时文件。你可以把upload_tmp_dir改成项目目录下的专属tmp文件夹,比如C:\inetpub\wwwroot\your-project\storage\tmp,给这个文件夹同样的权限,避开系统的自动清理机制。
内容的提问来源于stack exchange,提问作者Eiglimar Junior

