前兩天項目中須要用到異步上傳圖片和顯示上傳進度的功能,因而找了不少外國的文章,翻山越嶺地去趕上各類坑,這裏寫篇文章記錄一下。 HTML <form id="fileupload-form"> <input id="fileupload" type="file" name="file" > </form> HTML代碼沒什麼好說,一個form表單,還有文件類型的input。咱們來看js部分。 javascript //綁定了`submit`事件。 $('#fileupload-form').on('submit',(function(e) { e.preventDefault(); //序列化表單 var serializeData = $(this).serialize(); // var formData = new FormData(this); $(this).ajaxSubmit({ type:'POST', url: *yoururl*, dataType: 'json', data: serializeData, // data: formData, //attention!!! contentType: false, cache: false, processData:false, beforeSubmit: function() { //上傳圖片以前的處理 }, uploadProgress: function (event, position, total, percentComplete){ //在這裏控制進度條 }, success:function(){ }, error:function(data){ alert('上傳圖片出錯'); } }); })); //綁定文件選擇事件,一選擇了圖片,就讓`form`提交。 $("#fileupload").on("change", function() { $(this).parent().submit(); }); PHP <?php //經過$_FILES[]去獲取文件 echo '$_FILES['file']'; 遇到的坑: 序列化表單,由於是文件,不能經過val(),text()等方法獲取到它的值,只能經過序列化表單提交。代碼裏面使用.serialize(),有另一種作法是使用.FormData()來提交,可是實驗過程當中,一開始正常,後來報錯了。在stackoverflow.com上有人看到有人遇到一樣地問題,沒有解決,因而就放棄了。 普通的ajax是沒辦法或者說很難拿到上傳進度的。這裏使用了一個插件jQuery Form Plugin,使用方法很簡單,本來ajax的配置都能用,並且有不少實用功能和詳盡的使用文檔。推薦~ ajax上傳圖片這三個參數必須配置contentType: false, cache: false, processData:false,。 獲取本地預覽圖,這種方法可能會有瀏覽器兼容性問題。 $("#fileupload").change(function(){ if (this.files && this.files[0]) { var reader = new FileReader(); reader.onload = function (e) { $('#theImg').attr('src', e.target.result); } reader.readAsDataURL(this.files[0]); } } php部分注意雖然Ajax那裏使用的是POST方法,可是後臺接受的時候只要是文件都是用$_FILES。你能夠經過$_FILES['file']['type']去判斷文件格式來作安全處理,咱們這裏只是演示。還有其餘參數,好比tmp_name是文件路徑,name是文件名。後臺接收之後,你可使用move_uploaded_file()來將文件保存到服務器上。這裏就很少說。
若是提示: $(...).ajaxSubmit is not a functionjavascript
頁面js出現TypeError: $(...).ajaxSubmit is not a function 錯誤。php
解決辦法是:將jQuery-form.js文件引入頁面便可。java
jquery-form.js 下載地址:連接: http://pan.baidu.com/s/1ntHqJKP 密碼: geb2jquery