问题描述
前端使用POST请求上传文件时,有可能文件过大,此时需要返回给前端的友善的提示,为了实现该功能,添加了一个handler对上传文件进行处理,如下:
@Override public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) { String contentType = request.getContentType(); if (StrKit.notBlank(contentType) && contentType.contains(MULTIPART_CONTENT_TYPE)) { if (!(request instanceof MultipartRequest)) { try { request = new MultipartRequest(request); } catch (ExceededSizeException e) { log.error("上传文件大小超过限制", e); //不在让后续的filter处理该请求 isHandled[0] = true; //返回响应 RespBody respBody = new RespBody(); respBody.setResult(ResultCode.UPLOAD_FILE_TO_LARGE); RenderManager.me().getRenderFactory().getJsonRender(respBody).setContext(request, response).render(); return; } } } next.handle(target, request, response, isHandled); }
注:RespBody是自定义的类,用于和前端交互
但是发现前端的并不能处理此HTTP响应,如下:
上传文件请求直接失败,ajax代码如下:
function upload() { $.ajax({ url: '/api/v3/upload/batchUploadSong', type: 'POST', cache: false, data: new FormData($('#form')[0]), //告诉jquery不要处理发送的数据 processData: false, //告诉jQuery不要去设置Content-Type请求头 contentType: false }).done(function (result) { if (result.code === 200) { alert("成功"); } else { alert(result.message); } }).fail(function (jqXHR) { alert("请检查上传压缩包是否过大,若过大,请分开上传;若压缩包大小符合要求,请联系工作人员"); }); }
其执行了.fail()中的代码.
思考
我看了JsonRender.render()的代码,就是简单的向response.getWriter()用写字符串,然后刷新,感觉应该不是jfinal框架的问题,而且也不应该出现此问题,没有什么排查的思路,请各位大佬指点~~
public void render() { if (jsonText == null) { buildJsonText(); } PrintWriter writer = null; try { response.setHeader("Pragma", "no-cache"); // HTTP/1.0 caches might not implement Cache-Control and might only implement Pragma: no-cache response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType(forIE ? contentTypeForIE : contentType); writer = response.getWriter(); writer.write(jsonText); writer.flush(); } catch (IOException e) { throw new RenderException(e); } }
项目:JFinal