SpringMVC+ajaxfileupload文件上传返回json下载?请大神指导!

发布于 2021-12-02 16:36:58 字数 5129 浏览 762 评论 16

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(16

拍不死你 2021-12-06 12:34:45

坐等大神回答!谢谢!

拥有 2021-12-06 12:34:42

org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 一般这个不用配置,默认就行

千纸鹤带着心事 2021-12-06 12:34:42

OK。浏览器 firebug 跟踪下

英雄似剑 2021-12-06 12:34:40

回复
不需要配置,你都有注解了,直接@ResponseBody

樱花落人离去 2021-12-06 12:34:40

回复
不用这个配置,请问怎么配置?

倚栏听风 2021-12-06 12:34:20

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

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

最偏执的依靠 2021-12-06 12:33:20

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

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

刘备忘录 2021-12-06 12:30:39

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

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

偏爱自由 2021-12-06 12:28:01

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

緦唸λ蓇 2021-12-06 12:10:44

@sea_wind 没有完美解决方案,目前解决方案是: 不使用@responseBody注解,自己利用Jackson转化为json格式,通过response输出;这样根据业务需要自己控制。

月亮是我掰弯的 2021-12-06 11:56:53

回复
这里注意返回接收要使用text类型

梦里兽 2021-12-06 11:48:37

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

由于我用的是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

https://www.wenjiangs.com/wp-content/uploads/oschina/2021/105244_PCvE_107380.png

终止放荡 2021-12-06 04:43:46

是不是如果用ajaxfileupload.js上传文件,后台返回json就不能用@responseBody 配置的Jackson 适配转换器转化,只能自己手动构建json字符串,设置Content-Type为“text/html;chartset=UTF-8”,然后通过response输出!

沦落红尘 2021-12-06 02:34:42

回复
我在项目里面配置jackjson转换器 也没成功过,后面不得已才用response直接写出

眉黛浅 2021-12-05 21:05:24

赞一个

酷到爆炸 2021-12-04 06:53:40

刚解决这问题,请设置

//com.alibaba.fastjson.JSONObject

 // JSONObject json =new JSONObject();

response.setContentType("text/html");

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文