SpringMVC+ajaxfileupload文件上传返回json下载?请大神指导!
SpringMVC+ajaxfileupload文件上传返回json下载?请大神指导!
利用ajaxfileupload文件上传,后台处理springmvc 返回json,但是提示下载json
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>user_list</title> <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.10.2.js" ></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.form.js" ></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/ajaxfileupload.js" ></script> </head> <body> <div id="loading" style="display:none;">加载中...</div> 文件上传(ajax提交) <a href="${pageContext.request.contextPath}/sys/user/list.jhtml">返回</a> <form id="form3" action="${pageContext.request.contextPath}/sys/user/upload1.jhtml" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" id="uploadFile" name="file" /> <br/> <input type="button" id="submitBtn3" name="submitBtn3" value="上传" onclick="upload();" /> <input type="reset" value="取消" /> </form> <script type="text/javascript"> function upload(){ $("#loading").ajaxStart(function(){ $(this).show(); }).ajaxComplete(function(){ $(this).hide(); }); $.ajaxFileUpload ( { url:'upload1.jhtml', secureuri:false, fileElementId:'uploadFile', dataType: 'json', success: function (data, status) { alert(data); if(data.status==1){ alert(data.result); }else{ alert("【提交失败!】"); } }, error: function (data, status, e) { alert("【服务器异常,请连续管理员!】"+e); } } ); return false; } </script> </body> </html>
@RequestMapping(value="upload1",method=RequestMethod.POST) @ResponseBody public Map<String, Object> upload1(HttpServletRequest request, HttpServletResponse response,@RequestParam MultipartFile file) throws Exception { Map<String, Object> jsonMap = new HashMap<String, Object>(); if(file.isEmpty()){ jsonMap.put("status", -1); jsonMap.put("result", "【文件为空!】"); System.out.println("【文件为空!】"); return jsonMap; } String fileName=file.getOriginalFilename(); SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd"); String uploadPath=request.getSession().getServletContext().getRealPath(Constants.UPLOAD_FILE_DIR+sdf.format(new Date())); System.out.println(uploadPath); File uploadDir=new File(uploadPath); if(!uploadDir.exists()){ uploadDir.mkdirs(); } File uploadFile=new File(uploadPath+"/"+fileName); file.transferTo(uploadFile);//上传 System.out.println("上传成功!"); jsonMap.put("status", 1); jsonMap.put("result", "【上传成功!】"); return jsonMap; }
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="cacheSeconds" value="0" /> <property name="messageConverters"> <list> <!-- 加入Jackson json库 --> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> </list> </property> </bean> <!--对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="redirectHttp10Compatible" value="false" /> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="contentType" value="text/html;charset=UTF-8" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <!-- 处理文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8" /> <!-- 编码 --> <property name="maxInMemorySize" value="10240" /> <!-- 上传时占用最大内存大小 (10240) --> <property name="uploadTempDir" value="/attachment/upload/temp/" /> <!-- 上传临时保存目录名 ,带文件上传完成之后会自动删除保存的文件--> <property name="maxUploadSize" value="-1" /> <!-- 最大文件大小,-1为无限止(-1) --> </bean>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
坐等大神回答!谢谢!
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 一般这个不用配置,默认就行
OK。浏览器 firebug 跟踪下
回复
不需要配置,你都有注解了,直接@ResponseBody
回复
不用这个配置,请问怎么配置?
引用来自“贰狮叔”的评论
IE 浏览器问题。换个就没问题。
引用来自“通天塔”的评论
没有指明返回的 Content-Type,你在spring mvc的配置文件中添加相关的MessageConverter,再配置supportedMediaTypes支持 application/json
引用来自“通天塔”的评论
没有指明返回的 Content-Type,你在spring mvc的配置文件中添加相关的MessageConverter,再配置supportedMediaTypes支持 application/json
没有指明返回的 Content-Type,你在spring mvc的配置文件中添加相关的MessageConverter,再配置supportedMediaTypes支持 application/json
@sea_wind 没有完美解决方案,目前解决方案是: 不使用@responseBody注解,自己利用Jackson转化为json格式,通过response输出;这样根据业务需要自己控制。
回复
这里注意返回接收要使用text类型
也刚刚解决了这个问题,感觉也有些缺陷。
由于我用的是spring mvc 3.2版本配置如下:
ajaxfileupload不支持响应头ContentType为application/json设置,不支持原因可能是为了浏览器兼容,因为ie不支持application/json格式,另外firefox, chrome浏览器iframe在接收application/json格式的时候会自动将其转化为html格式,自动在json数据前后加上<pre></pre>标签导致ajaxfileupload插件取json数据错误
而spring mvc在处理JSON格式的响应时,会自动将响应头设置为application/json,则导致ajaxfileupload处理报错,所以这里强制将响应头的content-Type设置为text/html;charset=UTF-8,不过这样导致所有使用@ResponseBody注解地方响应头的content-Type都会设置为text/html;charset=UTF-8,无法进行单独的差异化处理。
不知道楼主还有没有更好的解决方案
补充:不好意思没太看清你的配置,你的配置好像没有太大问题,是否是其他地方影响了响应头的返回,因为你这里响应头还是application/json
是不是如果用ajaxfileupload.js上传文件,后台返回json就不能用@responseBody 配置的Jackson 适配转换器转化,只能自己手动构建json字符串,设置Content-Type为“text/html;chartset=UTF-8”,然后通过response输出!
回复
我在项目里面配置jackjson转换器 也没成功过,后面不得已才用response直接写出
赞一个
刚解决这问题,请设置
//com.alibaba.fastjson.JSONObject
// JSONObject json =new JSONObject();
response.setContentType("text/html");
response.getWriter().write(json.toJSONString());
因为ajaxfileupload 只支持ContentType("text/html");