23
回答
SpringMVC+ajaxfileupload文件上传返回json下载?请大神指导!
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

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>




举报

以下是问题补充:

  • @帐号以作废 :后台已经处理上传成功了!就是前台返回json不会进入回调函数,请大神回答! (4年前)
共有23个答案 最后回答: 9个月前


刚解决这问题,请设置

//com.alibaba.fastjson.JSONObject

 // JSONObject json =new JSONObject();

response.setContentType("text/html");

response.getWriter().write(json.toJSONString());

因为ajaxfileupload 只支持ContentType("text/html");


--- 共有 3 条评论 ---
瓶子_LYP赞一个 3年前 回复
大喵哥回复 @爱德华-张 : 我在项目里面配置jackjson转换器 也没成功过,后面不得已才用response直接写出 4年前 回复
帐号以作废是不是如果用ajaxfileupload.js上传文件,后台返回json就不能用@responseBody 配置的Jackson 适配转换器转化,只能自己手动构建json字符串,设置Content-Type为“text/html;chartset=UTF-8”,然后通过response输出! 4年前 回复


也刚刚解决了这个问题,感觉也有些缺陷。

由于我用的是spring mvc 3.2版本配置如下:

<mvc:annotation-driven>
		<mvc:message-converters register-defaults="true">  
			<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
				<property name="supportedMediaTypes">
					<list>
						<value>text/html;charset=UTF-8</value>
					</list>
				</property>
			</bean>
		</mvc:message-converters>  
	</mvc:annotation-driven>
ajaxfileupload不支持响应头ContentType为application/json设置,不支持原因可能是为了浏览器兼容,因为ie不支持application/json格式,另外firefox, chrome浏览器iframe在接收application/json格式的时候会自动将其转化为html格式,自动在json数据前后加上<pre></pre>标签导致ajaxfileupload插件取json数据错误
<pre style="word-wrap: break-word; white-space: pre-wrap;">{"message":"上传成功","code":200}</pre>



而spring mvc在处理JSON格式的响应时,会自动将响应头设置为application/json,则导致ajaxfileupload处理报错,所以这里强制将响应头的content-Type设置为text/html;charset=UTF-8,不过这样导致所有使用@ResponseBody注解地方响应头的content-Type都会设置为text/html;charset=UTF-8,无法进行单独的差异化处理。

 不知道楼主还有没有更好的解决方案

补充:不好意思没太看清你的配置,你的配置好像没有太大问题,是否是其他地方影响了响应头的返回,因为你这里响应头还是application/json

http://static.oschina.net/uploads/space/2014/0418/105244_PCvE_107380.png


--- 共有 2 条评论 ---
炎南鹰回复 @搬代码的程序猿 : 这里注意返回接收要使用text类型 3年前 回复
帐号以作废@sea_wind 没有完美解决方案,目前解决方案是: 不使用@responseBody注解,自己利用Jackson转化为json格式,通过response输出;这样根据业务需要自己控制。 4年前 回复

没有指明返回的 Content-Type,你在spring mvc的配置文件中添加相关的MessageConverter,再配置supportedMediaTypes支持 application/json

引用来自“通天塔”的评论

没有指明返回的 Content-Type,你在spring mvc的配置文件中添加相关的MessageConverter,再配置supportedMediaTypes支持 application/json

<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>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>

</bean>


这样配置吗?

引用来自“通天塔”的评论

没有指明返回的 Content-Type,你在spring mvc的配置文件中添加相关的MessageConverter,再配置supportedMediaTypes支持 application/json

引用来自“org.zhanghua”的评论

<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>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>

</bean>


这样配置吗?

测试,不行!

引用来自“贰狮叔”的评论

IE 浏览器问题。换个就没问题。

其他浏览器也不行,IE提示下载,其他浏览器没有反应

--- 共有 4 条评论 ---
丛林老鱼回复 @爱德华-张 : 不需要配置,你都有注解了,直接@ResponseBody 4年前 回复
帐号以作废回复 @贰狮叔 : 不用这个配置,请问怎么配置? 4年前 回复
丛林老鱼org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 一般这个不用配置,默认就行 4年前 回复
丛林老鱼OK。浏览器 firebug 跟踪下 4年前 回复
顶部