概述
最近项目上有一个小需求就是在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下进行查看
最后
以上就是瘦瘦星月为你收集整理的关于SpringMVC content-type的那些事的全部内容,希望文章能够帮你解决关于SpringMVC content-type的那些事所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复