總結一下,JavaWeb前後端常見的幾種上傳檔案的方式:
一、JavaWeb前端上傳檔案的幾種方式:
1、表單上傳
最傳統的圖片上傳方式是form表單上傳,使用form表單的input[type="file"]控制元件,開啟系統的檔案選擇對話方塊,從而達到選擇檔案並上傳的目的。
程式碼示例如下:
<form action="uploadFile" method="post" enctype="multipart/form-data"> <label for="file">檔名</label> <input id="file" name="file" type="file"/> <input type="submit" name="submit" value="提交"/></form>
表單上傳需要注意以下幾點:
(1)提供form表單,method必須是post型別。
(2)form表單的enctype必須是multipart/form-data。
enctype屬性規定在傳送到伺服器之前應該如何對錶單資料進行編碼。預設地,表單資料會編碼為“application/x-www-form-urlencoded”。就是說,在傳送到伺服器之前,所有字元都會進行編碼。HTML表單如何打包資料檔案是由enctype這個屬性決定的。enctype有以下幾種取值:
application/x-www-form-urlencoded:在傳送之前編碼所有字元(預設)(空格被編碼為‘+’,特殊字元被編碼為ASCII十六進位制字元)。multipart/form-data:不對字元編碼。在使用包含檔案上傳控制元件的表單時,必須使用該值。text/plain:空格轉換為“+”加號,但不對特殊字元編碼。預設enctype=application/x-www-form-urlencoded,所以表單的內容會按URL規則編碼,然後根據表單的提交方法:
method='get' 編碼後的表單內容附加在請求連線後,
method='post' 編碼後的表單內容作為post請求的正文內容。
(3)提供input type="file"上傳輸入域。
2、Ajax上傳
ajax和FormData可實現頁面無重新整理的檔案上傳效果,主要用到了jQuery的ajax()方法和XMLHttpRequest Level 2的FormData介面。透過FormData物件可以更靈活方便地傳送表單資料,因為可以獨立於表單使用。如果你把表單的編碼型別設定為multipart/form-data,則透過FormData傳輸的資料格式和表單透過submit()方法傳輸的資料格式相同。
<form> <input type="file" name="file" id="file"/></form><script> $("#file").on("change", function() { var formData = new FormData(); formData.append("file", $("#file")[0].files[0]); $.ajax({ url: "uploadFile", type: "POST", data: formData, processData: false, contentType: false, success: function(response) { alert("hahaha"); } }); })</script>
ajax無重新整理上傳的方式,本質上與表單上傳無異,只是把表單裡的內容提出來採用ajax提交,並且由前端決定請求結果回傳後的展示結果。
3、各類外掛上傳
當上傳的需求要求可預覽、顯示上傳進度、中斷上傳過程、大檔案分片上傳等等,這時傳統的表單上傳很難實現這些功能,我們可以藉助現有外掛完成。
如:百度上傳外掛Web Upload、jQuery圖片預覽外掛imgPreview、拖拽上傳與影象預覽外掛Dropzone.js等等。
二、JavaWeb後端上傳檔案的幾種方式:
1、使用springMVC原生上傳檔案方法
(1)首先需要一些簡單的配置
@RequestMapping("upload")public String upload(HttpServletRequest request) throws IllegalStateException, IOException { long startTime = System.currentTimeMillis(); //將當前上下文初始化給CommonsMutipartResolver(多部分解析器) CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver( request.getSession().getServletContext()); //檢查form中是否有enctype="multipart/form-data" if(multipartResolver.isMultipart(request)) { //將request變成多部分request MultipartHttpServletRequest multiRequest= (MultipartHttpServletRequest)request; //獲取multiRequest 中所有的檔名 Iterator iter=multiRequest.getFileNames(); while(iter.hasNext()) { //一次遍歷所有檔案 MultipartFile file=multiRequest. getFile(iter.next().toString()); if(file!=null) { String path = "E:/upload/"+ file.getOriginalFilename(); //上傳 file.transferTo(new File(path)); } } } long endTime = System.currentTimeMillis(); System.out.println("Spring方法的執行時間:" +String.valueOf(endTime-startTime)+"ms"); return "success"; }
2、採用file.Transto來儲存上傳的檔案,這是目前自認為最好的上傳方式,程式碼簡單,速度快
@RequestMapping("upload")public String upload(@RequestParam("file")CommonsMultipartFile file) throws IOException { long startTime = System.currentTimeMillis(); System.out.println("fileName:"+file.getOriginalFilename()); String path = "E:/upload/" + new Date().getTime()+ file.getOriginalFilename(); File newFile = new File(path); //透過CommonsMultipartFile的方法直接寫檔案 file.transferTo(newFile); long endTime = System.currentTimeMillis(); System.out.println("採用file.Transto的執行時間:" +String.valueof(endTime-startTime)+"ms"); return "success";}
3、採用流的方式上傳
此方式又慢又難寫
@RequestMapping("upload")public String upload(@RequestParam("file")CommonsMultipartFile file) throws IOException { //用來檢測程式執行時間 long startTime = System.currentTimeMillis(); System.out.println("fileName:"+file.getOriginalFilename); try { //獲取輸出流 OutputStream oStream = new FileOutputStream( "E:/upload/"+new Date().getTime() + file.getOriginalFilename()); //獲取輸入流CommonsMultipartFile中可以直接得到檔案的流 InputStream iStream = file.getInputStream(); byte[] bts = new byte[1024]; //一個位元組一個位元組地讀取並寫入 while(iStream.read(bts)!=-1) { oStream.write(bts); } oStream.flush(); oStream.close(); iStream.close(); } catch(FileNotFoundException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println("採用流上傳的方式的執行時間:"+ String.valueOf(endTime-startTime)+"ms"); return "success";}
JavaWeb後臺上傳的這三種方式中,第二種最優,第一種次之,第三種最不推薦。