Laravel 5.4.12 hasFile 有 bug
laravel 5.4.12 hasFile 有bug,不管上传有没有文件,都判断为false
echo $request->thumbnail;
dd( $request->hasFile('thumbnail'));
官方文档:https://learnku.com/docs/laravel/5.4/requests
解决办法:判断文件名是否为空
dd( $request->thumbnail<>'');
本作品采用《CC 协议》,转载必须注明作者和本文链接
从你代码来看
thumbnail
应该是一个字符串,当然不是文件了,laravel如果有这种低级错误也不会成为如此流行的框架了@leo laravel 5.2 就是这样判断是否包含文件啊,不然怎么判断呢?官方也是给的这样的示例呢。
主要是我找不到出错的地方,大神帮忙测试一下……
@andu 贴前端代码
@leo 我用文件名就可以判断是否有上传文件啊,这个与前端代码有什么关系啊。
测试了好多次,就这个判断里的问题啊。你上传判断试试。
@andu 所以很明显这里你上传的是 文件名 而不是文件本身,文件应该是提前上传好了
@leo 怎么会呢,唉,文件都上传成功了。
你测试一下就知道了。
@andu 所以我让你贴前端代码
@leo 国外也有类似的问题,明显是bug啊。
链接:https://github.com/laravel/framework/issue...
文件对象是空的?
@freyo 文件都能上传成功,我给出了解决办法了啊。就是说官方给的hasfile目前不能用而已,希望5.5修复这个bug。
@andu 你form表单没有添加
enctype="multipart/form-data"
属性吧@freyo 使用laravel-html,form中添加files=true就会自动添加这个属性了。
以下代碼沒問題
@jl9404 是laravel5.4.9以上版本么?
@jl9404 手机上没看到你用了hasfile函数啊。社区在手机浏览器上展示不全啊。
@andu 我本地5.4.15测试没问题
@freyo 请打印hasfile的返回值看看?
@andu
测试了一下,如果确实是上传的文件,
echo $request-> thumbnail
输出的应该是该文件在服务端的临时路径,比如/tmp/phpmHX0YN
而不会是文件的原名称,所以基本可以断定你上传的是 文件名,所以我一直让你贴前端代码,就是要确认这个事情@freyo 不是file啊,说了可以上传文件,是hasfile这个函数而已,判断当前file控件是否有上传文件,有就是true,否则就是false。
@leo 我虽然才学laravel没多久,但不要用其他语言的或者经验来判断好不。再次强调,我不用hasfile来判断,就是正常的了,文件上传没问题,肯定是能上传文件的。你用这个函数来判断file控件是否包含文件就行了,输出结果是boolean类型。
@andu 我从来没有用别的语言来看待这个问题。解决问题要么基于经验要么基于代码,既然你否决经验,又不提供代码,那你为啥要来问问题,你看github的issue,提问者把前后端代码都提供了,而你只提供了后端代码,贴个前端代码很困难吗
@andu hasFile判断的就是UploadedFile,file上传后默认就是这个类
其實你一直不貼代碼的話 沒有人可以幫到你的
還有你所貼的 issue 是張貼者自己的問題 不是 laravel 的問題
@jl9404 首先我发现了这个bug,而且给出了解决办法,有可能帮助别人好哒,只是让高手看看确认这个bug而已。
其次我一直都在用手机回复,贴不了代码,而且后台代码就在上面。就是判断hasfile这个函数,不用也无伤大雅。国外网站上另外一个开发者发现了同样的问题,这么简单的单词你如果不认识可以用百度翻译。我更相信你是简单的飘了一眼没用心看。
还有上面回帖说已经验证了,那你是怎么判断没上传文件时返回null吗?你不用判断?
前台就是一个form表单加lnput上传控件,我都说了在laravel5.2 上是正常的,换到最新的5.4就有问题,我虽然小白,到你们也别先入为主就认为我前台代码就一定错误吧?你好歹也打印一下hasfile看看结果吧。我贴出来的链接官方文档有实例。
感谢大家的积极回复。真理是越辩越明的。
所以他的意思是 laravel 的問題嗎?
樓主加油 先退出討論了
可以正常上传文件,而且上面的freyo朋友也打印出了上传文件的实体,肯定不为空啊。
hasFile
函数出问题了啊。没毛病呀,5.2和5.4结果都是true
@生活无限好 那做什么呢?你来围观我很欢迎,但你一副拽拽的模样你就能写代码了?我贴出了问题,我或骄傲或傲慢,但请你就事论事,我错了我认错,我对了为啥不能说出来?我学习laravel就这么十几天,能发现个小问题难道不能傲娇一下?
@生活无限好 哈哈,你好傻。
樓主帶有自動拉黑功能 當所有人說沒問題的時候 他也要堅持自己的"解決"方法是對的 sweat_smile:
@荣耀与梦想 嗯,一直都在埋头学习在。有点着急气盛望谅解。回复都是用手机回复了,没仔细看@jl9404 的代码,手机上显示不全,今天也没仔细看他贴出来的代码。
下面图是我的前台代码,有可能是你说的问题,但我不知道原因。
感谢@jl9404 的回复,你的代码没问题,我找不到自己的出错地方。
@andu 虽然我删除了回复主要是想了想不趟浑水的好,不过呢,既然你贴出前台代码,而且看起来还是正确的,那么我们就可以排除一个原因了。软件工程这个角度来讲,其实更多的是用来解决各种各样的问题。
回到你这里,看起来后台代码不错,前台代码也不错,那么如同 @leo 所讲,后台接收到的对象就是一个 String 了,而不是一个 UploadedFile 对象。所以我估计 @leo 据此判断
而且这也符合你的现象,那么问题来了,这应该服务器配置问题(个人愚见),你需要排查的是,你上传文件的大小有没有超过你 Apache / Ningx 和 php.ini 的上限,大概只有这种情况才会出现文件提交到后台,但是后端拿不到的这种情况。
需要排查以下设置:
1,upload_max_filesize
2,post_max_size
3,以及 upload_tmp_dir 的权限
等等关于上传文件的设置。
如果不对,再想别的方法来解决问题。
最后的最后呢,关于你的心情我大概能了解,刚毕业那些年我也是这样,一旦发现点什么东西,很想迅速的分享出来,以获得一种成就感,不过被打击得多了之后,据我从业 10 多年的浅显经验来看呢,很多事情,不要轻易的下结论 为好,共勉。
@Summer 能不能加个修改评论的功能呢,有时候办公室偷摸回复来不及看排版,想修改的时候只能删除 :smiley:
@荣耀与梦想 很赞同你的观点。但有时候就需要点傻傻的锐气,才能让自己一直坚持下去。比如上高速,有时候超车可以提神,是不是让自己紧张一下,反而更安全,当然这个度很重要。
我一直认为要对事不对人,当然自己也有气盛的地方。比如5.2可以这样用,5.4就一定能这样用,否则就认为是bug,这个观点要不得。
回到本文这个具体的问题上,我使用的是intervention/image 这个package,你说的要排查的问题都没有,因为我能正常上传文件,不存在 @leo 说的这里是个字符串。
我更新了一下,现在能正常判断了,就此结贴,应该是我本地配置错误,具体在什么地方,我也不知道。
就此结贴,我向大家致歉,如那位歪果开发者所说,应该是本地配置错误问题,不是laravel 5.4的bug。
其实我还是特别想问一下,你最终找到问题所在了吗?
不猜测其他的可能,但我在遇到这种情况的时候,在from中加上了 enctype="multipart/form-data"属性,确实成功做到了hasfile
我也遇到这个问题,一看都四年了。这个问题的原因在PHP 的配置文件 php.ini 中,正是@荣耀与梦想 指出的,修改允许文件的最大值(upload_max_filesize),大于你的文件即可。 在此谢谢@荣耀与梦想