首頁>技術>

總結一下,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後臺上傳的這三種方式中,第二種最優,第一種次之,第三種最不推薦。

11
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 翻譯:《實用的Python程式設計》1_7_Functions