文件上傳的動作不能太俗,必須頁面無刷新上傳


人生永遠沒有太晚的開始

  好久沒有更新博客了,說實話,每天抽空打開博客園總感覺心里很空虛,不是沒有在修行,而是因為最近在跟着博老前輩完成一項很重要的使命——打造屬於我們自己的奇遇帝國,好了廢話不多說,首先我在北京向各位帶好,希望各位能在2018年達到自己預設的人生高度。

常規操作上傳文件

1 <form action="xxx.action" method="post" enctype="multipart/form-data">
2     <input type="file" name="userfile" multiple><br>
3     <input type="submit" value="上傳">
4 </form>

  點擊那個誘人的submit按鈕上傳,OK,完成!相信很多大佬還在用上面這種簡單粗暴的方式完成文件上傳的動作,哥哥,都什么時代了,還用這種方式,如果提交這樣的代碼上去,臉都會被打腫,我們要的是頁面無刷新上傳哦,哈哈哈~~~~

頁面無刷新上傳文件

  完成這項優雅的操作,首先是有必要認識一下XMLHttpRequest對象的,XMLHttpRequest是一個 API,它為客戶端提供了在客戶端和服務器之間傳輸數據的功能。它提供了一個通過 URL 來獲取數據的簡單方式,並且不會使整個頁面刷新。這使得網頁只更新一部分頁面而不會打擾到用戶。XMLHttpRequest 在 AJAX 中被大量使用。說到這里就有人說,你賣了半天關子,不就是異步上傳嘛,ajax誰不會,分分鍾的事兒就優雅的完成了,但是我想說ajax固然重要也依然能很好的完成這個動作,有時候專業的事情交給專業的人去做效果是非常好的。

接下來我強調一點,因為我們接下來討論的XMLHttpRequest指的是XMLHttpRequest Level 2,因為XMLHttpRequest Level 1有如下限制:

  • 僅支持文本數據傳輸, 無法傳輸二進制數據.
  • 傳輸數據時, 沒有進度信息提示, 只能提示是否完成.
  • 受瀏覽器 同源策略 限制, 只能請求同域資源.
  • 沒有超時機制, 不方便掌控ajax請求節奏.

但是XMLHttpRequest Level 2針對這些缺陷做出良好的改進:

  • 支持二進制數據, 可以上傳文件, 可以使用FormData對象管理表單.
  • 提供進度提示, 可通過 xhr.upload.onprogress 事件回調方法獲取傳輸進度.
  • 依然受 同源策略 限制, 這個安全機制不會變. XHR2新提供 Access-Control-Allow-Origin 等headers, 設置為 * 時表示允許任何域名請求, 從而實現跨域CORS訪問(有關CORS詳細介紹請耐心往下讀).
  • 可以設置timeout 及 ontimeout, 方便設置超時時長和超時后續處理.

目前, 主流瀏覽器基本上都支持XMLHttpRequest Level 2, 除了IE系列需要IE10及更高版本. 因此IE10以下是不支持XHR2的.

要碼運行

整個上傳的動作概括為一句話就是:這里提到的FormData就是我們最常用的一種方式,通過在腳本里新建FormData對象,把File對象設置到表單項中,然后利用XMLHttpRequest異步上傳到后台服務器即可,就很簡單的完成真個優雅的動作。

<!-- XMLHttpRequest實現異步上傳文件 -->
<input type="file" name="userfile" onchange="fileSelected(this);" multiple/>
<script type="text/javascript">
    function fileSelected(userfile) {
        uploadFile(userfile);
    }
    function uploadFile(userfile) {
        var fd = new FormData();         //FormData對象
        var length = userfile.files.length;        //獲取選中文件的個數(單文件直接追加即可)
        for(var i=0; i<length; i++){
            fd.append("userfile", userfile.files[i]);    //多文件追加到FormData
        }
        //fd.append("userfile", userfile.files[0]);        //單文件追加到FormData
        var xhr = new XMLHttpRequest();       //XMLHttpRequest對象
        xhr.open("POST", "${qy }/upload/uploadFiles");      //初始化一個請求
        // 注意:所有相關的事件綁定必須在調用send()方法之前進行.
        xhr.send(fd);//發送請求. 如果該請求是異步模式(默認),該方法會立刻返回. 相反,如果請求是同步模式,則直到請求的響應完全接受以后,該方法才會返回.
    }
</script>
 1      /**
 2      * 多文件上傳
 3      * @param file
 4      * @return
 5      * @throws Exception
 6      */
 7     @RequestMapping(value="/uploadFiles",method=RequestMethod.POST)
 8     @ResponseBody
 9     public String uploadFiles(@RequestParam("userfile")MultipartFile[] file) throws Exception{
10         int fileNumber = file.length;
11         if(fileNumber == 0){
12             logger.info("上傳內容為空");
13             return "請選擇文件";
14         }else{

 

參考

XMLHttpRequest API:https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest

優秀博客URL:http://louiszhai.github.io/2016/11/02/ajax/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM