ajax异步上传文件,ajax提交表单中的文件到后台解析

原生ajax是不能提交文件的,因为ajax与后台的通信是通过字符串的.

那么如何实现呢?

本文需要使用jquery.form.js同时,还需要引用jquery.js

以上传excel到后台并解析为例:

首先看一下表单的书写.

例如:

 

				  	<form id="signupListImportForm" class="import-file-form" enctype="multipart/form-data">
	      				<input type="hidden" name="courseId" value="${course.id}">
	      				<input type="file" name="excelFile" id="excelFile" style="width:160px" value="选择文件">
		                <input class="fabu_button_e margin-right-20" type="button" value="导入线下报名" inited=" " onclick="submitExcel('${course.id}'); ">
				  	</form>


注意:

 

form中必须要有:enctype="multipart/form-data",input中type设置为file

表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作. 
enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去。

 

<span style="font-size:14px;"><script type="text/javascript">
	function submitExcel(courseId) {
		var excelFile = $("#excelFile").val();

		//如果文件为空
		if (excelFile == '') {

			uk.info.error('请上传excel文件!');
			return;
		}

		//如果文件不是xls或者xlsx 提示输入正确的excel文件
		if ((excelFile.indexOf('.xls') == -1 && excelFile.indexOf('.xlsx') == -1)) {

			uk.info.error('请上传正确的excel,后缀名为xls或xlsx!');
			return;
		}

		var option = {
			url : root + "/web/courseSignupListImport.do",
			type : 'POST',
			dataType : "json",
			clearForm: true,
			success : function(data) {
				if (data.returnCode == 1) {
					uk.info.error('导入信息成功!');
				}

			}
		};
		$("#signupListImportForm").ajaxSubmit(option);
		return false;

	}
</script></span>

 

 

 

 

后台接受

 

@RequestMapping(method=RequestMethod.POST, value="/courseSignupListImport")
	@ResponseBody
	 public Map<String,Object>  courseSignupListImport(@RequestParam("excelFile") MultipartFile excelFile,HttpServletRequest request, HttpServletResponse response) throws IOException
	{
		Map<String,Object> map = new HashMap<String,Object>();
		// 获取课程id
		String courseId = request.getParameter("courseId");

		HSSFWorkbook workbook = new HSSFWorkbook(excelFile.getInputStream());
		// 读取获取到的第一个sheet
		HSSFSheet sheet = workbook.getSheetAt(0);

		// 用于存放excel内容体
		List<List<String>> bodyList = new ArrayList<List<String>>();
		// 声明一个引用,用于临时存放每一行数据
		List<String> tmpList;

		for (int j = 0; j < sheet.getLastRowNum() + 1; j++) {
			// 创建一个行对象
			HSSFRow row = sheet.getRow(j);
			// 创建一个临时对象
			tmpList = new ArrayList<String>();

			// 把一行里的每一个字段遍历出来
			for (int i = 0; i < row.getLastCellNum(); i++) {
				// 创建一个行里的一个字段的对象,也就是获取到的一个单元格中的值
				HSSFCell cell = row.getCell(i);
				// 每一行的各个字段存入到表格中
				if (cell != null) {

					tmpList.add(cell.getRichStringCellValue().getString());
				} else {
					tmpList.add(null);
				}
			}

			bodyList.add(tmpList);
		}

		for (List<String> tempStrings : bodyList) {

			for (String string2 : tempStrings) {
				System.out.print("----" + string2 + "--------");
			}
			System.out.println();
		}
		
		 map.put("returnCode", 1);
		return map;

	}

 

 

 

 

 

下面介绍一下各个参数的具体使用:

Options对象
ajaxForm和ajaxSubmit都支持众多的选项参数,这些选项参数可以使用一个Options对象来提供。Options只是一个JavaScript对象,它包含了如下一些属性与值的集合:

target
指明页面中由服务器响应进行更新的元素。元素的值可能被指定为一个jQuery选择器字符串,一个jQuery对象,或者一个DOM元素。
默认值:null。

url
指定提交表单数据的URL。
默认值:表单的action属性值

type
指定提交表单数据的方法(method):“GET”或“POST”。
默认值:表单的method属性值(如果没有找到默认为“GET”)。

beforeSubmit
表单提交前被调用的回调函数。“beforeSubmit”回调函数作为一个钩子(hook),被提供来运行预提交逻辑或者校验表单数据。如果“beforeSubmit”回调函数返回false,那么表单将不被提交。“beforeSubmit”回调函数带三个调用参数:数组形式的表单数据,jQuery表单对象,以及传入ajaxForm/ajaxSubmit中的Options对象。表单数组接受以下方式的数据:
[ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
默认值:null

success
表单成功提交后调用的回调函数。如果提供“success”回调函数,当从服务器返回响应后它被调用。然后由dataType选项值决定传回responseText还是responseXML的值。
默认值:null

dataType
期望返回的数据类型。null、“xml”、“script”或者“json”其中之一。dataType提供一种方法,它规定了怎样处理服务器的响应。这个被直接地反映到jQuery.httpData方法中去。下面的值被支持:

'xml':如果dataType == 'xml',将把服务器响应作为XML来对待。同时,如果“success”回调方法被指定, 将传回responseXML值。
'json':如果dataType == 'json', 服务器响应将被求值,并传递到“success”回调方法,如果它被指定的话。
'script':如果dataType == 'script', 服务器响应将求值成纯文本。

默认值:null(服务器返回responseText值)

semantic
Boolean flag indicating whether data must be submitted in strict semantic order (slower). Note that the normal form serialization is done in semantic order with the exception of input elements of type="image". You should only set the semantic option to true if your server has strict semantic requirements and your form contains an input element of type="image".
布尔标志,表示数据是否必须严格按照语义顺序(slower?)来进行提交。注意:一般来说,表单已经按照语义顺序来进行了串行化(或序列化),除了type="image"的input元素。如果你的服务器有严格的语义要求,以及表单中包含有一个type="image"的input元素,就应该将semantic设置为true。(译注:这一段由于无法理解,翻译出来可能语不达意,但请达人指正。)
默认值:false

resetForm
布尔标志,表示如果表单提交成功是否进行重置。

Default value: null

clearForm
布尔标志,表示如果表单提交成功是否清除表单数据。
默认值:null 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页