一、form表单
从页面form书写开始,上传文件的form与一般的form书写上有一点小小的差距,具体例子如下:
<form id="uploadForm" enctype="multipart/form-data" method="post">
<input type="file" name="excelFile" id="file_input"/>
</form>
首先,在form上有一个特殊的属性enctype="multipart/form-data"。enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
其次,在input标签中,需要上传文件的输入框,其属性为type="file"
二、无跳转的JS书写
在上传的时候,当我们点击提交之后,一般不希望页面发生跳转,只希望返回上传的结果。那儿如何实现不跳转提交呢?下面是本次项目使用的方式:
function upload() {
var fm = new FormData($("#uploadForm")[0]);
//进行Ajax请求
$.ajax({
//几个参数需要注意一下
type: "POST",//方法类型
dataType: "json",//预期服务器返回的数据类型,可以不设置
url: "/ndi2.0/sourceManage/uploadExcelData.action" ,//url
data: fm,
async: false,
cache: false,
contentType: false, //禁止设置请求类型
processData: false, //禁止jquery对DAta数据的处理,默认会处理
success: function (result) {
console.log(result);//打印服务端返回的数据(调试用)
if (result.isSuccess) {
//跳转页面
//window.location.href="user/personalDesk.action";
}
},
error : function() {
alert("异常!");
}
});
}
FormData对象用以将数据编译成键值对,以便用XMLHttpRequest
来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用。如果表单enctype
属性设为multipart/form-data ,则会使用表单的submit()
方法来发送数据,从而,发送数据具有同样形式。
关于FormData对象的详细介绍:https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/Using_FormData_Objects
三、Java代码的写法
@RequestMapping(value="/uploadExcelData.action",method=RequestMethod.POST)
@ResponseBody
public Map<String,String> uploadExcelData(
HttpServletResponse response,HttpServletRequest request,
@RequestParam("excelFile") MultipartFile file,
@RequestParam("type") String type) {
Map<String,String> map = new HashMap<String,String>();
try {
//获取到上传文件流
InputStream is = file.getInputStream();
map.put("success", "true");
map.put("msg", "上传成功");
} catch (IOException e) {
e.printStackTrace();
map.put("success", "fasle");
map.put("msg", "上传失败,请联系管理员");
}
return map;
}
显然,@RequestParam注解中的参数名称需要与表单中的name相同,如果上传的文件,则接收的类型应当为MultipartFile