关于SpringMVC content-type的那些事

最近项目上有一个小需求就是在form表单中上传一个excel文件,然后controller中对上传的excel数据进行读取然后执行dao操作


前端代码如下:

<div class="apply-r">
	<a class="pure-button upload" style="text-decoration: none" href="#" οnclick="$('#upid').click();" >导入商品</a>
	<input id="upid" style="display:none;" class="up-file" type="file" name="files" οnchange="fileChange(this);"/>
</div>
js代码:

//批量上传文件
function fileChange(target) {
	if (target.files && target.files[0]) {
		var file = target.files[0];
		target.value = "";
		var filedata = new FormData();
		filedata.append("multipartFile", file);
		doUpload(filedata);
	}
}

function doUpload(filedata) {
	console.log("doUpload");
	$.ajax({
		url: '#springUrl("/product/addBatch.do")',
		type: 'POST',
		data: filedata,
		async: false,
		cache: false,
		contentType: false,
		processData: false,
		success: function (result, status) {
			if (result.statusCode == 301) {
				$(".session-model").show();
				return;
			}
			if (status == "success" && result.success) {
				showTips(result.message ? result.message : result.returnMessage);
				productList(1)
			} else {
				showTips(result.message ? result.message : result.returnMessage);
			}
		}

	});
}
后台java代码:部分代码没有贴出来,这里我们只是进行关于Content-type的说明和介绍

@RequestMapping(value="/addBatch.do")
@ResponseBody
public AjaxResponse addBatch(HttpSession session, @RequestParam("multipartFile") MultipartFile multipartFile) {
	AjaxResponse ajaxResponse = new AjaxResponse();
	try {
		String merchantId = ProcessSessionUser.getMember(session, CommonConstant.MEMBER_ID);
                //将导入的文档的数据读取出来
		List<ProductInfo> productInfoList = ExcelToObjectConvert.excelConvertToDomain(multipartFile, merchantId);
		//进行插入到数据库的操作
		productManageService.addBatch(productInfoList);
		ProcessAjaxResponse.processResponse(true, ajaxResponse, null, ReturnCode.ADD_SUCCESS);
	} catch (Exception e) {
		logger.error("执行[addBatch]异常:", e);
		ExceptionConvert.convertException(ajaxResponse, e);

	}
	logger.info("返回web结果:{}", ajaxResponse);
	return ajaxResponse;
}


以上前端和后端的代码在google IE11上正确执行通过,但是在IE9上又出现兼容性问题。

然后前端同事将代码修改成如下方式:

<div class="apply-r">
	<label>
       <a class="pure-button upload" style="text-decoration: none" >导入商品</a>
       <form id="myForm" method="post" enctype="multipart/form-data">
	       <input type="file" id="upid" name="multipartFile" οnchange="fileChange(this)" style="display:none"/>
	   </form>
	</label>
</div>

前端js修改如下:

//批量上传文件
function fileChange(target) {
	var option = {
		url : '#springUrl("/product/addBatch.do")',
		type: 'POST',
		success : function(data) {
		   var objData = {};
		   if(data.indexOf('<pre>')>=0) {
			  objData = JSON.parse($(data).html());
		   } else{
			  objData = JSON.parse(data);
		   }
		   if (objData.statusCode == 301) {
			  $(".session-model").show();
			  return;
		    }
			if (objData.success) {
			  showTips(objData.message ? objData.message : objData.returnMessage);
			  productList(1)
			} else {
			  showTips(objData.message ? objData.message : objData.returnMessage);
			}
		},
		error: function(data) {
			 //alert(data.)
		},   
		  resetForm : true
	   };
	$("#myForm").ajaxSubmit(option);
	return false;
}
这个时候在IE9的情况下,前端同事让我返回一个文本格式的字符串,但是字符串的内容为一个JSON格式

之前在postman调试下,后台代码修改之前的可以看出action返回的content-type为application/json;charset=UTF-8



所以这个时候我们要将后台代码返回的content-type修改成文本格式

大家可以去阅读下我装载的一篇文章  Http请求中Content-Type讲解以及在Spring MVC中的应用 

这篇文章详细说明了Springmvc下content-type,其中重点关注下RequestMapping的一些参数值

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

当然关于Spring如何返回处理JSON或者XML格式的数据可以使用到matter,这里我们先说下这种方法,上篇文章中可以看出要修改成 文本格式就要将content-type修改成 text/plain

常见的媒体格式类型如下:

  •     text/html : HTML格式
  •     text/plain :纯文本格式      
  •     text/xml :  XML格式
  •     image/gif :gif图片格式    
  •     image/jpeg :jpg图片格式 
  •     image/png:png图片格式

所以我将后台代码修改成如下:

@RequestMapping(value="/addBatch.do",produces="text/plain;charset=utf-8")
@ResponseBody
public String addBatch(HttpSession session, @RequestParam("multipartFile") MultipartFile multipartFile) {
	AjaxResponse ajaxResponse = new AjaxResponse();
	try {
		String merchantId = ProcessSessionUser.getMember(session, CommonConstant.MEMBER_ID);
		List<ProductInfo> productInfoList = ExcelToObjectConvert.excelConvertToDomain(multipartFile, merchantId);
		productManageService.addBatch(productInfoList);
		ProcessAjaxResponse.processResponse(true, ajaxResponse, null, ReturnCode.ADD_SUCCESS);
	} catch (Exception e) {
		logger.error("执行[addBatch]异常:", e);
		ExceptionConvert.convertException(ajaxResponse, e);
	}
	logger.info("返回web结果:{}", ajaxResponse);
	return JSON.toJSONString(ajaxResponse);
}
produces处理的是返回值的数据格式  如果设置 produces="text/plain"  这样返回的数据为乱码

所以要设置 charset=utf-8

我们可以在postman下进行查看












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值