Laravel 5.4.12 hasFile 有 bug

laravel 5.4.12 hasFile 有bug,不管上传有没有文件,都判断为false

echo $request->thumbnail;
dd( $request->hasFile('thumbnail'));

file

file

官方文档:https://learnku.com/docs/laravel/5.4/requests

file

解决办法:判断文件名是否为空

dd( $request->thumbnail<>'');

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 39
leo

从你代码来看thumbnail应该是一个字符串,当然不是文件了,laravel如果有这种低级错误也不会成为如此流行的框架了

7年前 评论

@leo laravel 5.2 就是这样判断是否包含文件啊,不然怎么判断呢?官方也是给的这样的示例呢。

主要是我找不到出错的地方,大神帮忙测试一下……

7年前 评论
leo

@andu 贴前端代码

7年前 评论

@leo 我用文件名就可以判断是否有上传文件啊,这个与前端代码有什么关系啊。

file

测试了好多次,就这个判断里的问题啊。你上传判断试试。

7年前 评论
leo

@andu 所以很明显这里你上传的是 文件名 而不是文件本身,文件应该是提前上传好了

7年前 评论

@leo 怎么会呢,唉,文件都上传成功了。

file

你测试一下就知道了。

7年前 评论
leo

@andu 所以我让你贴前端代码

7年前 评论

@leo 国外也有类似的问题,明显是bug啊。

链接:https://github.com/laravel/framework/issue...

file

7年前 评论

文件对象是空的?

7年前 评论

@freyo 文件都能上传成功,我给出了解决办法了啊。就是说官方给的hasfile目前不能用而已,希望5.5修复这个bug。

7年前 评论

@andu 你form表单没有添加enctype="multipart/form-data"属性吧

7年前 评论

@freyo 使用laravel-html,form中添加files=true就会自动添加这个属性了。

7年前 评论

以下代碼沒問題

  Route::get('/upload', function () {
     $html  = '<form action="./upload" method="post" enctype="multipart/form-data">';
     $html .= csrf_field();
     $html .= '<input type="file" name="testFile" />';
     $html .= '<button type="submit">Upload</button>';
     $html .= '</form>';
     return $html;
  });

  Route::post('/upload', function (\Illuminate\Http\Request $request) {
     dd($request->allFiles(), $request->file('testFile'), $request->hasFile('testFile'));
  });
7年前 评论

@jl9404 是laravel5.4.9以上版本么?

7年前 评论

@jl9404 手机上没看到你用了hasfile函数啊。社区在手机浏览器上展示不全啊。

7年前 评论

@andu 我本地5.4.15测试没问题

7年前 评论

@freyo 请打印hasfile的返回值看看?

7年前 评论
leo

测试了一下,如果确实是上传的文件,echo $request-> thumbnail输出的应该是该文件在服务端的临时路径,比如/tmp/phpmHX0YN而不会是文件的原名称,所以基本可以断定你上传的是 文件名,所以我一直让你贴前端代码,就是要确认这个事情

7年前 评论

@freyo 不是file啊,说了可以上传文件,是hasfile这个函数而已,判断当前file控件是否有上传文件,有就是true,否则就是false。

7年前 评论

@leo 我虽然才学laravel没多久,但不要用其他语言的或者经验来判断好不。再次强调,我不用hasfile来判断,就是正常的了,文件上传没问题,肯定是能上传文件的。你用这个函数来判断file控件是否包含文件就行了,输出结果是boolean类型。

7年前 评论
leo

@andu 我从来没有用别的语言来看待这个问题。解决问题要么基于经验要么基于代码,既然你否决经验,又不提供代码,那你为啥要来问问题,你看github的issue,提问者把前后端代码都提供了,而你只提供了后端代码,贴个前端代码很困难吗

7年前 评论

@andu hasFile判断的就是UploadedFile,file上传后默认就是这个类

7年前 评论

其實你一直不貼代碼的話 沒有人可以幫到你的
還有你所貼的 issue 是張貼者自己的問題 不是 laravel 的問題

7年前 评论

@jl9404 首先我发现了这个bug,而且给出了解决办法,有可能帮助别人好哒,只是让高手看看确认这个bug而已。
其次我一直都在用手机回复,贴不了代码,而且后台代码就在上面。就是判断hasfile这个函数,不用也无伤大雅。国外网站上另外一个开发者发现了同样的问题,这么简单的单词你如果不认识可以用百度翻译。我更相信你是简单的飘了一眼没用心看。
还有上面回帖说已经验证了,那你是怎么判断没上传文件时返回null吗?你不用判断?
前台就是一个form表单加lnput上传控件,我都说了在laravel5.2 上是正常的,换到最新的5.4就有问题,我虽然小白,到你们也别先入为主就认为我前台代码就一定错误吧?你好歹也打印一下hasfile看看结果吧。我贴出来的链接官方文档有实例。
感谢大家的积极回复。真理是越辩越明的。

7年前 评论

file
所以他的意思是 laravel 的問題嗎?
樓主加油 先退出討論了

7年前 评论

可以正常上传文件,而且上面的freyo朋友也打印出了上传文件的实体,肯定不为空啊。

7年前 评论

hasFile 函数出问题了啊。

7年前 评论

没毛病呀,5.2和5.4结果都是true

7年前 评论

@生活无限好 那做什么呢?你来围观我很欢迎,但你一副拽拽的模样你就能写代码了?我贴出了问题,我或骄傲或傲慢,但请你就事论事,我错了我认错,我对了为啥不能说出来?我学习laravel就这么十几天,能发现个小问题难道不能傲娇一下?

7年前 评论

樓主帶有自動拉黑功能 當所有人說沒問題的時候 他也要堅持自己的"解決"方法是對的 sweat_smile:

7年前 评论

@荣耀与梦想 嗯,一直都在埋头学习在。有点着急气盛望谅解。回复都是用手机回复了,没仔细看@jl9404 的代码,手机上显示不全,今天也没仔细看他贴出来的代码。

下面图是我的前台代码,有可能是你说的问题,但我不知道原因。

file

file

file

感谢@jl9404 的回复,你的代码没问题,我找不到自己的出错地方。

7年前 评论

@andu 虽然我删除了回复主要是想了想不趟浑水的好,不过呢,既然你贴出前台代码,而且看起来还是正确的,那么我们就可以排除一个原因了。软件工程这个角度来讲,其实更多的是用来解决各种各样的问题。

回到你这里,看起来后台代码不错,前台代码也不错,那么如同 @leo 所讲,后台接收到的对象就是一个 String 了,而不是一个 UploadedFile 对象。所以我估计 @leo 据此判断

所以很明显这里你上传的是 文件名 而不是文件本身,文件应该是提前上传好了

而且这也符合你的现象,那么问题来了,这应该服务器配置问题(个人愚见),你需要排查的是,你上传文件的大小有没有超过你 Apache / Ningx 和 php.ini 的上限,大概只有这种情况才会出现文件提交到后台,但是后端拿不到的这种情况。
需要排查以下设置:

1,upload_max_filesize

2,post_max_size

3,以及 upload_tmp_dir 的权限

等等关于上传文件的设置。

如果不对,再想别的方法来解决问题。

最后的最后呢,关于你的心情我大概能了解,刚毕业那些年我也是这样,一旦发现点什么东西,很想迅速的分享出来,以获得一种成就感,不过被打击得多了之后,据我从业 10 多年的浅显经验来看呢,很多事情,不要轻易的下结论 为好,共勉。

7年前 评论

@Summer 能不能加个修改评论的功能呢,有时候办公室偷摸回复来不及看排版,想修改的时候只能删除 :smiley:

7年前 评论

@荣耀与梦想 很赞同你的观点。但有时候就需要点傻傻的锐气,才能让自己一直坚持下去。比如上高速,有时候超车可以提神,是不是让自己紧张一下,反而更安全,当然这个度很重要。

我一直认为要对事不对人,当然自己也有气盛的地方。比如5.2可以这样用,5.4就一定能这样用,否则就认为是bug,这个观点要不得。

回到本文这个具体的问题上,我使用的是intervention/image 这个package,你说的要排查的问题都没有,因为我能正常上传文件,不存在 @leo 说的这里是个字符串。

我更新了一下,现在能正常判断了,就此结贴,应该是我本地配置错误,具体在什么地方,我也不知道。

就此结贴,我向大家致歉,如那位歪果开发者所说,应该是本地配置错误问题,不是laravel 5.4的bug。

7年前 评论

其实我还是特别想问一下,你最终找到问题所在了吗?

7年前 评论

不猜测其他的可能,但我在遇到这种情况的时候,在from中加上了 enctype="multipart/form-data"属性,确实成功做到了hasfile

7年前 评论

我也遇到这个问题,一看都四年了。这个问题的原因在PHP 的配置文件 php.ini 中,正是@荣耀与梦想 指出的,修改允许文件的最大值(upload_max_filesize),大于你的文件即可。 在此谢谢@荣耀与梦想

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!