做文件上传的时候遇到点麻烦,ExtJS上传文件要求服务器端返回的ContentType是“text/html”,而Spring MVC默认返回的是“application/json”,于是ExtJS这边总是报错说无法将”<pre>{success: true}</pre>”转换成JSON,很奇怪的一件事就是:为什么会出现pre标签呢?
先看看当前服务器端的代码:
1 2 3 4 5 6 7 8 | public @ResponseBody Map<String, Object> upload(UserVO userVO){ Map<String, Object> modelMap = new HashMap<String, Object>(); if(!userVO.getUserPhoto().isEmpty()){ userVO.getUserPhoto().transferTo(new File("文件存放路径")); } modelMap.put("success", true); return modelMap; } |
用上面这种方式处理的时候,文件上传了成功了,但是就会出现文章开头所描述的问题,于是我改成这样:
1 2 3 4 5 6 | public void upload(UserVO userVO, HttpServletResponse response){ String json = "{success: true}"; response.setContentType("text/html"); response.getWriter().write(json); response.flushBuffer(); } |
现在,ExtJS不会报错了,也成功触发了Form的success事件,但是服务器端又报错了,说是无法找到”upload.jsp”,其实我请求的是”upload.action”,而且也成功响应了,但是不知道为什么,Spring貌似是将”action”替换成”jsp”又转发跳转了一下,百度谷歌无解!
其实,最最主要的就是能够将response的ContextType设置为“text/xml”就没问题了。参考Spring的文档找到解决办法如下:
方法一:
1 2 3 4 5 6 | public ResponseEntity<String> upload(UserVO userVO){ String json = "{success: true}"; HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentType(MediaType.TEXT_HTML); return new ResponseEntity<String>(json, responseHeaders, HttpStatus.OK); } |
方法二:
先在messageConverters中配置StringHttpMessageConverter:
1 2 3 4 5 6 7 8 9 10 11 | <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer" /> </property> <property name="messageConverters"> <list> <bean class = "org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html;charset=UTF-8" /> </bean> </list> </property> </bean> |
然后在这样就OK了(注意:方法的返回类型必须是String):
1 2 3 4 | public @ResponseBody String upload(UserVO userVO){ String json = "{success: true}"; return json; } |
参考文档:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html
再补充一个可行的方法三:
1 2 3 4 5 6 7 | public void upload(HttpServletResponse response, UserVO userVO){ Map<String, Object> result = new HashMap<String, Object>(0); result.put("success", true); response.setContentType("text/html"); ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(response.getOutputStream(), result); } |
问题解决了,但是还是不知道到底是哪出现的pre标签。
技术贴
学习,谢谢分享哦
太技术了,我看到代码头就大。
谁叫我是程序猿呢?
最近忙啥呢?好久木有更新了。
哈哈 快过年了么不是,各种忙,另外我负责的项目也处于收尾阶段了。
说实话,这东西不太好调试。
我们部门另一个项目组用过这个,我们项目组没有用过。 不过说回来,js这玩意本身就不怎么好调试。
@下午茶 嗯 是啊