FormData + ajax方式上传附件,附件超过限制json信息无法正常返回

如题

前端代码image.png

后端代码

image.png

后台在controller中捕获了异常,然后使用renderJson返回错误信息;但是在前台只能收到net::ERR_CONNECTION_RESET错误,无法拿到具体的错误信息!这个有没有解决方案?

注:使用了ngix代理是能成功返回200,和对应的错误信息



结帖:2020年01月18日

问题原因:tomcat版本原因,tomcat发生了重定向导致MaxUploadSizeExceededException死循环问题;所以不是JFinal的锅,包括SpringMvc也有该问题;

解决方案一:我的tomcat版本是8.5,换到7.0.39版本就没问题了;

解决方案二:把JFinal的上传大小限制调高,然后自定义一个附件大小验证的Interceptor,在Interceptor里定义实际要限制的附件大小;这样有个好处就是,JFinal不会把附件上传到BaseUploadPath;



@JFinal 

评论区

JFinal

2019-10-12 12:09

打开浏览器开发者工具,查看请求的 enctype="multipart/form-data" 是不是对的,文件上传需要配置这个参数

此外,java 端的 catch 中需要 renderJson(...) 才能反回正确的数据给客户端

JFinal

2019-10-12 12:14

补充一下,使用 jquery 的 ajax 上传,一般是构造一个 form 表单,form 表单要配置 enctype="multipart/form-data" 属性

如果页面没有 form 表单,可以动态构造一个,如果有页面但不希望被看见,可以让 input type="file" 隐藏起来

代号而已

2019-10-12 14:04

@JFinal 我的bjuiAjax就是调用的renderJson

代号而已

2019-10-12 14:10

@JFinal 我这边因为某些特殊原因需要使用FormData,var formData = new FormData(document.getElementById('uploadForm')); 这个uploadForm中有enctype="multipart/form-data"属性

代号而已

2019-10-12 14:13

@JFinal 使用FormData上传没有超过限制的附件是没有任何问题的

代号而已

2019-10-12 14:25

@JFinal 我重新上传了图片,这个是一个测试列子的代码,你可以看看

tianci121404

2019-10-12 15:42

如果catch里能捕获错误信息那就与jfinal没关系,submitForm函数里最后一行加个return false;试试,可能是js写的有问题

代号而已

2019-10-12 17:47

@tianci121404 是能catch,但是无法返回我给的json信息到客户端,也就是我无法在ajax返回中拿到那句附件大小超过限制;我尝试了你说的加return,没有效果;

JFinal

2019-10-12 18:51

@代号而已 ajax 的回调函数输出 alert(data) 看看返回的数据到底是什么,不要 if 判断,直接输出看看

JFinal

2019-10-12 18:57

这个问题,对于后端的 jfinal 来说就是一句 getFile 完事了

对于前端来说,你得写好 js 代码,参考这里:
https://www.jianshu.com/p/380661f02997

山东小木

2019-10-13 09:56

@JFinal 建议JFinal是不是除了COS 也考虑一下apache=fileupload的集成?

JFinal

2019-10-13 12:50

@山东小木 apache 那个有很多第三方依赖,况且文件上传这个属于 http 协议,很多年都没有变动过

代号而已

2019-10-14 09:01

@JFinal
ajax中不会进入到success方法,只会进入error和fail中,信息中只有一个“error”字符串;
前端我就是按照你给的链接中写的,至于后台我也不捕获异常,还是一样的效果;

同时,还发现一个现象,如果附件过大会重复调用后台的上传(upload)方法,不管是使用ajax还是form表单提交

tianci121404

2019-10-14 09:10

@代号而已 改成 一般可解决重复提交的问题,至于ajax未得到返回错误信息,建议找个js的高手咨询一下,ajaxSubmit需要同步,不能是异步的,这块百分百是js的问题,我对js也一直半解,所以抱歉只能提供个分析的思路

tianci121404

2019-10-14 09:15

@代号而已 button改成input 可解决重复提交的问题

代号而已

2019-10-14 10:27

@tianci121404 感谢回复
我测试了改成input还是重复调用提交;
ajax提交这个还是不知道是什么原因,用nginx做代理就能把我的错误信息给我返回到success方法中;方便的话你可以用上面代码试试;包旧引入jfinal 版本4.5、cos 版本2019.8

JFinal

2019-10-14 12:05

@代号而已 你现在正在用的本站的 ajax 提交回复功能就能避免重复提交,照抄这个页面的相关代码即可

代号而已

2019-10-17 15:36

@JFinal 我按照发送按钮做了页面的重复提交处理,但是还是会重复调用我的上传方法;这个不是页面造成的重复提交,是因为附件过大就会调用多次我的上传方法,如果是上传大小合适的文件就不会重复调用

JFinal

2019-10-17 15:54

@代号而已 单步调试弄清楚重复提交的机制,解决掉它

热门反馈

扫码入社