问题描述
前端使用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