因為有萬惡的 IE 存在,所以當Web項目初始化併進入開發階段時。 如果是項目經理,需要很明確的知道客戶將會用什麼瀏覽器來訪問系統。 明確知道限定瀏覽器的情況下,你才能從容的讓手下的封裝必要的前端組件。 本篇文章試圖從常見的上傳方式和組件進行分析,僅局限與前端,至於後端需依據業務複雜度,自行拿捏實現 ...
因為有萬惡的IE存在,所以當Web項目初始化併進入開發階段時。
如果是項目經理,需要知道客戶將會用什麼瀏覽器來訪問系統。
明確知道限定瀏覽器的情況下,你才能從容的讓手下的封裝必要的前端組件。
本篇文章試圖從常見的上傳方式和組件進行分析,僅局限與前端,至於後端需依據業務複雜度,自行拿捏實現方式,若文中有紕漏,歡迎拍磚!
1. Input type="file" 也可以性感
當然你也可以不用任何成熟的上傳組件,表單提交文件,像這樣:
<form action="<%=request.getContextPath()%>/uploadfile" method="POST" enctype="multipart/form-data"> yourfile: <input type="file" name="myfiles"/><br/> <input type="submit"/> </form>
多個文件一起提交,添加裡面的 input 選項即可,但 name 名稱需要一致。
當然你也可以在提交文件的時候,提交一些其他的參數數據上去,像下麵這樣:
<form action="<%=request.getContextPath()%>/uploadfile" method="POST" enctype="multipart/form-data"> username: <input type="text" name="username"/><br/> password: <input type="password" name="password"/><br/> yourfile: <input type="file" name="myfiles"/><br/> yourfile: <input type="file" name="myfiles"/><br/> yourfile: <input type="file" name="myfiles"/><br/> <input type="submit"/> </form>
註意其中的 enctype 設置為multipart/form-data。
這種上傳文件的方式,優缺點顯而易見,不需要使用任何第三方 js,純天然 html 標簽、走到哪用到哪、沒有瀏覽器障礙.....
對於多變的項目需求,比如這些特性:實時上傳的進度條、能拖拽文件上傳、上傳前壓縮、MD5加密驗證等.....
你需要耐著性子自己實現,有造好的輪子,你為什麼不用呢?
所以說這種性感撩人的 <input type="file"> 的標簽能出現的項目,定位在小型簡單、客戶好說話的web應用中。
2. Uploadify 雙版本上傳組件
這個組件想必是用的比較廣泛,提供 Flash 和 HTML5 兩個不同的版本,能讓你避免很多瀏覽器相容性的問題。
支持顯示文件上傳實時進度條,拖拽文件上傳、多樣化的參數配置、高度可定製化....能滿足絕大部分項目的上傳需求。
官網地址:http://www.uploadify.com/
其中 Flash 版是免費下載的,但 HTML5 版本需要掏錢,如果你需要H5 Version,請在評論區留郵箱。
使用這個組件的前提,需要先引入 Jquery:
<script type="text/javascript" src="/style/js/jquery.js"></script> <script type="text/javascript" src="/style/js/jquery.uploadify.min.js"></script> <style type="text/css" src="/style/js/uploadify.css"></style> <div class="updiv"> <div class="upfileAfter"> <a href="javascript:$('#upfileBtn').uploadify('upload','*')">開始上傳</a> </div> <a href="#" id="upfileBtn">選擇文件</a> </div>
初始化組件方法(具體的參數設置和回調函數的入參請查閱官方文檔):
$("#upfileBtn").uploadify({ 'debug': false,// 開啟調試 'auto': false,// 是否自動上傳 //'simUploadLimit' : 3, //併發上傳數量[falsh版不生效] //'successTimeout': 30,// 預設值30秒,文件上傳完成時等待伺服器響應的時間,之後顯示成功信息。 'fileObjName' : 'file', 'swf': XX+ "/style/js/uploadifynochange/uploadify.swf", 'uploader': XX + '/service/uploadFile',// 上傳處理程式 'formData': {'fjzlDm': '', timeStamp: ''}, 'multi': true,// 是否支持多文件上傳 'width': '95px',// 瀏覽按鈕的寬度 'height': '30px',// 瀏覽按鈕的高度 'progressData' : 'speed', //文件進度條的樣式 'buttonText': '<i class="icon icon-file icon-white"></i> 選擇文件', //按鈕文字 'fileSizeLimit': '10240',//上傳文件大小限制 'fileTypeExts': '*.bmp;*.png;*.jpeg;*.jpg;*.gif',//可上傳的文件類型 'overrideEvents': ['onDialogClose','onUploadSuccess','onUploadError'], 'onFallback': function () { alert("您未安裝FLASH控制項,無法上傳圖片!請安裝FLASH控制項後再試。");// 檢測FLASH失敗調用 }, 'onDialogClose': function () { alert("Dialog Close......"); }, 'onUploadSuccess': function (file, data, response) { alert("UploadSuccess......"); }, 'onUploadError' : function () { alert("Upload Error......"); } });
網上有很多上傳組件都是修改 Uploadify 的源碼的某一部分,然後重新命名的。
這個組件在項目中表現確實不錯,使用 Flash version 瀏覽器中只需要安裝 Flash Player 即可。
當下瀏覽器中不安裝 Flash Player 的確找不出幾個。
但不置可否的是 Flash 效率 沒有 H5 的高,相容性和穩定性必須捨棄一部分,讓兩者都有相對最優解。
3. Web Uploader 百度技術團隊開源力作
Webuploader 是由百度 Fex-team 團隊開發,官網地址:http://fex.baidu.com/webuploader/
除了 Uploadify 的所有特性,最吸引人的特點是文件可以分片併發上傳、同一組件內部決定使用 Flash 還是 H5 上傳....
最後出場的一般都是壓軸人物,不否認的是現在我們中項目中使用的就是 Web Uploader 組件。
不在為瀏覽器的相容性而頻繁更換組件調整代碼,Uploader 會根據運行環境切換上傳的方式,讓你更省心。
<script type="text/javascript" src="/style/js/jquery.js"></script> <script type="text/javascript" src="/style/js/webuploader.min.js"></script> <style type="text/css" src="/style/js/webuploader.css"></style> <div id="uploader" class="wu-example"> <div id="thelist" class="uploader-list"></div> <div class="btns" style="position: relative;display: inline-block"> <div id="picker"><i class="glyphicon glyphicon-plus"></i>點擊添加文件</div> <a href="#" id="up-all">開始上傳</a> </div> </div>
初始化組件方法(具體的參數設置和回調函數的入參請查閱官方文檔):
var uploader = WebUploader.create({ // swf文件路徑 swf: '/style/js/webuploade/Uploader.swf', // 文件接收服務端。 server: '/service/uploadFile', auto: false, formData: { paramA: 'paramA' }, // 選擇文件的按鈕。可選。 // 內部根據當前運行是創建,可能是input元素,也可能是flash. pick: '#picker' }); $("#up-all").on("click",function(){ uploader.upload(); }); // 當有文件被添加進隊列的時候 uploader.on('fileQueued', function (file) { $("#thelist").append('<div id="' + file.id + '" class="item">' + '<h4 class="info">' + file.name + '</h4>' + '<p class="state">等待上傳...</p>' + '</div>'); }); // 文件上傳過程中創建進度條實時顯示 uploader.on('uploadProgress', function (file, percentage) { var $li = $('#' + file.id), $percent = $li.find('.progress .progress-bar'); // 避免重覆創建 if (!$percent.length) { $percent = $('<div class="progress progress-striped active">' + '<div class="progress-bar" role="progressbar" style="width: 0%">' + '</div>' + '</div>').appendTo($li).find('.progress-bar'); } $li.find('p.state').text('上傳中'); $percent.css('width', percentage * 100 + '%'); }); uploader.on('uploadError', function (file) { $('#' + file.id).find('p.state').text('上傳出錯'); }); uploader.on('uploadComplete', function (file) { $('#' + file.id).find('.progress').fadeOut(); }); uploader.on('startUpload', function () { uploader.option('formData', {'paramA': ''}); });View Code
Uploadify 和 Uploader 都可以動態的添加表單參數。
個人偏向於喜歡百度的這款 Uploader,但仁者見仁智者見智,多幾種選擇未嘗不是好事情。
還需要註意的是,在實現獲取上傳文件的過程中,我發現只有表單提交上去的多文件是在一次請求當中。
而 Uploadify 和 Uploader 都是點擊全部上傳後,多次請求後端的 Action,每次只攜帶一個文件。
請求次數等於你的文件上傳次數,我在實現過程中是通過添加時間戳的方式解決的該問題。
也有可能是我使用的有問題,文件上傳後肯定需要和具體的業務掛鉤,業務問題這裡就不贅述了。