HTML5——摒棄插件和前端框架的異步文件上傳


  之前我從來沒有體會到HTML5的便利,直到這次需要一個異步上傳的功能功能。一開始我以為文件的一些聲明必須為HTML5才管用,后來才知道添加了很多以前沒有的標簽,並可以直接播放視頻,音頻等。可以不再使用Flash插件實現動畫。然並卵,覺得這些東西跟平時用到的有什么關系,因為我從來不需要在網頁中嵌入什么視頻,音頻甚至是動畫。這也是對我來說HTML5跟之前的版本沒有太大區別的一個原因。

  HTML5本質上還是HTML語言,簡單易用,只是增加了標簽(我是這么認為),這個對瀏覽器廠商的要求,即使再加幾個標簽叫HTML10跟開發Web應用程序的關系不大,因為最重要的是瀏覽器的支持。

  在實際中,我要做的是一個郵件群發的功能,其中郵件賬號是上傳csv文件,因為主要是演示一下html5的異步上傳,所以我將業務需求簡化為上傳csv文件,文件的每行只有一個郵箱賬號,讀取文件的內容,判斷是否為郵箱,為郵箱返回成功,否則返回郵件格式不對。並沒有加入信息存入數據庫或服務器等代碼。以往的html ajax實現不了異步上傳,需要加入jquery等異步上傳的插件或者使用一些前端框架。演示的代碼的前端使用HTML5,后端使用的是Spring MVC框架,實現的一個簡易的異步文件上傳功能。

  

  后端代碼簡單沒有什么可說的,先看下后端代碼:

  誠如所見,如果為非郵箱格式返回 “error” , 格式正確返回 “success”

 

前端 js 代碼如下: 

 1 function upLoad(){
 2     // 獲取文件對象
 3      var fileObj = document.getElementById("myfile").files[0]; 
 4     // 接收上傳文件的后台地址
 5      var url= "${ctx}/emailMass/emailMass.do"; 
 6     // FormData 對象
 7      var form = new FormData();
 8     form.append("myfile", fileObj);
 9    
10      form.append("emailAccount", $("#emailAccount").val()); 
11    
12      // XMLHttpRequest 對象
13      var xhr = new XMLHttpRequest();
14     xhr.open("post", url, true);
15 
16 
17     xhr.onload = function () {
18         if(xhr.responseText=="success"){
19           alert("群發消息成功");
20         }
21 
22         if(xhr.responseText=="error"){
23           alert("郵箱格式有誤,請檢查");
24         }
25     };
26     xhr.send(form);
27 }


注意:1 xhr.onload 回調函數並沒有參數,不能像普通的ajax 回調函數中 有一個 data 參數,如function (data){},這個data的值即返回值,

    XMLHTTPRequest對象是通過 responseText獲得返回值得。

   2 后端程序的返回值如果為中文,會存在亂碼,這兩點都是在使用ajax 時候不會遇到的。

   3 ie8不支持FormData這個對象,如果是一個后台的管理系統一般不必考慮瀏覽器兼容問題,若是前台供客戶使用的系統要考慮到瀏覽器是否支持慎用此方法。

  現在即使開發前台系統也不會再兼容ie6了,還用ie6的用戶是拋棄了時代,這樣的用戶我們也拋棄他(最頭痛的就是兼容問題,以前我們常這么打趣的說),希望那一天也拋棄ie8,我相信不會遠(偷笑)

  前端的js除了返回值如果是中文亂碼我沒有解決(所以我返回英文,然后翻譯成中文),如果表單元素太多,通過FormData對象的append方法一個一個添加,也是件麻煩事

 

使用HTML5的上傳是不是很簡潔?

作為對比,可以看看其他異步上傳的方法

如果使用的是 ajaxfileupload ,首先你需要引入js  <script src="../js/ajaxfileupload.js"></script

前台代碼如下:

 1  $(function(){  
 2      //選擇文件之后執行上傳  
 3      $('#fileToUpload').on('change', function() {  
 4           $.ajaxFileUpload({  
 5               url:'/emailMass/emailMass.do',  
 6               fileElementId:'myfile',//file標簽的id  
 7               dataType: 'json',//返回數據的類型  
 8               data:{emailAccount:$("#emailAccount").val()},//一同上傳的數據  
 9               success: function (data, status) {   
10                    
11            if(data=="success"){
12            alert("群發消息成功");
13          }
14  
15         if(data=="error"){
16            alert("郵箱格式有誤,請檢查");
17         }
18              },  
19              error: function (data, status, e) {  
20                  alert(e);  
21              }  
22          });  
23      });  
24        
25  });  

  似乎使用別的方式也並不復雜,只需要引入其他js即可,確實如此,但是引入的js 要跟jquery 版本適應,不然很容易出現沖突,從而前台js報錯,無法執行。

 Html5也是得顯示進度便得簡單,只需在原有的上傳函數中加入如下代碼:

1  xhr.upload.onprogress = function (ev) {
2                 var percent = 0;
3                 if(ev.lengthComputable) {
4                     percent = 100 * ev.loaded/ev.total;
5                     document.getElementById('bar').style.width = percent + '%';
6                 }
7             }

 其中“bar”是進度條的id,你並不需要關心 ev.loaded 和 ev.total ,ev對象中瀏覽器已經做好了一切,總共有多少數據,上傳了多少等內容

為了看得更清楚,進度條的靜態html如下: 

 1 <html>
 2     <head>  
 3     <style>
 4         #progress{ 
 5         border: 1px solid blue; 
 6         width:500px; 
 7         height:20px; 
 8         } 
 9         #bar { 
10         background:green; 
11         height:20px; 
12         width:0%; 
13         } 
14     </style>
15      </head>
16 <div id="progress"><div id="bar"></div></div>
17 </html>    

其實進度條就是不斷改變 “bar”層的寬度,bar層的背景是綠色的,隨着上傳進度的增加,寬度的百分比不斷增加,當完成時,綠色條框也就達到100%

 


免責聲明!

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



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