使用Ajax異步上傳圖片的方法(html,javascript,php)


前兩天項目中需要用到異步上傳圖片和顯示上傳進度的功能,於是找了很多外國的文章,翻山越嶺地去遇上各種坑,這里寫篇文章記錄一下。

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 function

 

頁面js出現TypeError: $(...).ajaxSubmit is not a function 錯誤。

解決辦法是:將jQuery-form.js文件引入頁面即可。

jquery-form.js 下載地址:鏈接: http://pan.baidu.com/s/1ntHqJKP 密碼: geb2


免責聲明!

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



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