XMLHttpRequest Level 2 添加了一個新的接口—— FormData。利用 FormData 對象,咱們能夠經過 JavaScript 用一些鍵值對來模擬一系列表單控件,咱們還能夠使用 XMLHttpRequest 的 send() 方法來異步的提交表單,經過FormData對象能夠組裝一組用 XmlHttpRequest 發送請求的鍵/值對。它能夠更靈活方便的發送表單數據,由於能夠獨立於表單使用。若是你把表單的編碼類型設置爲multipart/form-data ,則經過FormData傳輸的數據格式和表單經過 submit() 方法傳輸的數據格式相同,與普通的 Ajax 相比,使用 FormData 的最大優勢就是咱們能夠異步上傳二進制文件。html
代碼上來先:ajax
$(function() { $('#upload').click(ajaxUpload); }); function ajaxUpload() { var file1 = $('#file1')[0].files[0]; var file2 = $('#file2')[0].files[0]; // 建立內存中的表單對象 var form = new FormData(); form.append('file1', file1); form.append('file2', file2); $.ajax({ url : 'account/upload.do', data : form, type : 'post', dataType : 'json', contentType : false, processData : false, success : function(obj) { //這裏的obj.state來自於JsonResult的成員變量 //0爲正常,1爲異常 if (obj.state == 0) { $('#result').html("成功"); } else { $('#result').html("出現了小錯誤"); } } }); }
其中 JsonResult 是自定義的一個返回 Json格式的 Java類,在 action中對於異步請求返回的是 Json格式的字符串。json
html 部分代碼:app
Ajax UpLoad: <br> <input id="file1" type="file"> <br> <input id="file2" type="file"> <br> <input type="button" value="submit" id="upload" /> <!-- 展現返回信息 --> <div id="result"></div>
後臺 Controller處理代碼:【類名上寫了映射 @RequestMapping("/account")】異步
/** * 文件上傳 * @param file1 * @param file2 * @return * @throws IllegalStateException * @throws IOException */ @RequestMapping("/upload.do") @ResponseBody public Object upload(MultipartFile file1, MultipartFile file2) throws IllegalStateException, IOException { // Spring MVC 中能夠利用MultiPartFile接收上傳的文件 // 文件中的一切數據均可以從MultiPartFile對象中找到 // 獲取上傳文件的原始文件名 String f1 = file1.getOriginalFilename(); String f2 = file2.getOriginalFilename(); System.out.println(f1); System.out.println(f2); // 保存上傳文件的三種方法: // 1. transferTo(目標文件) 將上傳文件直接保存到目標文件,能夠處理大文件 // 2. file1.getBytes() 獲取文件的所有字節,讀取到內存中,適合處理小文件 // 3. file1.getInputStream() 獲取上傳文件的流,適合處理大文件 // 第一種保存文件 File dir = new File("C:/demo"); dir.mkdir(); File fl1 = new File(dir, f1); File fl2 = new File(dir, f2); // file1.transferTo(fl1); // file2.transferTo(fl2); // 第三種保存文件 InputStream in = file1.getInputStream(); FileOutputStream out = new FileOutputStream(fl1); int b; while ((b = in.read()) != -1) { out.write(b); } in.close(); out.close(); InputStream in2 = file2.getInputStream(); FileOutputStream out2 = new FileOutputStream(fl2); byte[] buff = new byte[8 * 1024]; // 8k緩衝區 int b2; while ((b2 = in2.read(buff)) != -1) { out2.write(buff, 0, b2); } out2.close(); in2.close(); return new JsonResult(true); }