ajax中怎么使用FormData實現(xiàn)頁面無刷新上傳功能

這篇文章主要介紹“ajax中怎么使用FormData實現(xiàn)頁面無刷新上傳功能”,在日常操作中,相信很多人在ajax中怎么使用FormData實現(xiàn)頁面無刷新上傳功能問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”ajax中怎么使用FormData實現(xiàn)頁面無刷新上傳功能”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供做網(wǎng)站、網(wǎng)站設(shè)計、成都網(wǎng)頁設(shè)計、成都微信小程序、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、app軟件開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計公司,等你一起來見證!

1,先看效果圖

ajax中怎么使用FormData實現(xiàn)頁面無刷新上傳功能

期望的功能和效果很簡單:點擊頁面中的上傳文件表單控件,選擇文件后點擊“ajax提交”,將文件上傳至服務(wù)器,上傳成功后,頁面給出一個簡單的提示。

2,前端的代碼

看下html代碼:     

 <div class="box">
    <div>
     <div class="item">
      <input type="file" name="myfile" >
     </div>
     <div class="item">
      <button type="button"  class="btn-default">ajax提交</button>
     </div>
     <div class="item">
      <button type="submit"  class="btn-default">form提交</button>
     </div>
    </div>
    <div class="prompt" ></div>
   </div>
   <script src="../../js/jquery-3.1.0.min.js"></script>
   <script src="upload01.js"></script>

代碼很簡單,需要注意的是頁面中沒有用到form表單,那么怎么提交數(shù)據(jù)呢,答案是用FormData來模擬表單中的 <input type="file" name="myfile"> 控件。另外,頁面中的樣式?jīng)]有寫出來。下面來看下html中引入的upload01.js代碼,這個是重點。

upload01.js代碼:

 $(function($) {
  $('input[name=myfile]').on('change', function(e) {
   $('button[type=button]').on('click', function(e) {
    var formData = new FormData();
    // formData.ppend(name, element);
    formData.append('myfile', $('input[name=myfile]')[0].files[0]);
    $.ajax({
     url: 'upload.php',
     method: 'POST',
     data: formData,
     contentType: false, // 注意這里應(yīng)設(shè)為false
     processData: false,
     cache: false,
     success: function(data) {
     if (JSON.parse(data).result == 1) {
       $('.prompt').html(`文件${JSON.parse(data).filename}已上傳成功`);
      }
     },
     error: function (jqXHR) {
      console.log(JSON.stringify(jqXHR));
     }
    })
    .done(function(data) {
     console.log('done');
    })
    .fail(function(data) {
     console.log('fail');
    })
    .always(function(data) {
     console.log('always');
    });
   });
  });
 });

(1) 下面解釋下FormData,涉及到了代碼的第4、6、10行。

第4行 var formData = new FormData(); 實例化了一個空的FormData對象,可以認(rèn)為它就是一個form表單,但現(xiàn)在里面什么控件都沒有。

第6行 formData.append('myfile', $('input[name=myfile]')[0].files[0]); ,給實例化的formdata對象添加一個控件,注意這里添加的是已有控件 <input type="file" name="myfile" > (見html代碼第4行)。

FormData.append(name, value, filename)方法可以很方便的以“鍵-值”對的形式給FormData添加控件,注意第3個參數(shù)“上傳文名”是可選的,它的具體語法和用法見FormData。

第10行,將實例化的formData作為jQuery.ajax()方法data參數(shù)的值傳遞進(jìn)去,提交給后端服務(wù)器。

(2) 再解釋下ajax()方法中的contentType、processData參數(shù)。

contentType參數(shù),發(fā)起http請求時設(shè)置的請求頭中的contentType。jQuery.ajax()默認(rèn)的值為:'application/x-www-form-urlencoded; charset=UTF-8',這個在大多數(shù)情況下都是適用的。

但經(jīng)過測試,保持默認(rèn)時會報錯,因為發(fā)送的數(shù)據(jù)中有input type="file"(上傳文件),那么這時contentType應(yīng)該設(shè)置為'multipart/form-data',但如果指定為這個類型服務(wù)端(php)就會報這個錯誤: Warning: Missing boundary in multipart/form-data POST data in Unknown on line 0 。具體原因現(xiàn)在還不清楚,所以這里先將contentType設(shè)置為false,即不讓jQuery設(shè)置contentType。

processData參數(shù),根據(jù)jQuery.ajax()文檔中的解釋,默認(rèn)情況下,jQuery會處理發(fā)送的數(shù)據(jù),將數(shù)據(jù)按照'application/x-www-form-urlencoded'的要求轉(zhuǎn)換為查詢字符串,如果要發(fā)送的數(shù)據(jù)是DOMDocument或者不需要處理,就可以設(shè)置為false不讓jQuery轉(zhuǎn)換數(shù)據(jù),我們這里要發(fā)送的數(shù)據(jù)其實就是DOMDocument。

經(jīng)過測試,如果保持默認(rèn)(true)的話,在發(fā)起請求前js會報錯: TypeError: 'append' called on an object that does not implement interface FormData.

另外還有個dataType參數(shù),期望從服務(wù)器中返回的數(shù)據(jù)格式,這里最好也不要指定,而是讓jquery自己根據(jù)http響應(yīng)頭中的contentType判斷,然后返回一個合適的數(shù)據(jù)類型。指定后不會影響后臺程序的邏輯處理,但你在前端接收的數(shù)據(jù)很可能不是期望的數(shù)據(jù),于是js就會報這一類錯誤: SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data ,這個是將dataType指定為json后報的錯誤。

3,后端的php代碼

后端服務(wù)器是nginx,用php來處理發(fā)送過來的數(shù)據(jù),代碼也很簡單:

 <?php
 // var_dump($_REQUEST); // 為空數(shù)組
 // var_dump($_FILES); //不為空 
 // 當(dāng)使用FormData配合ajax上傳文件時,$_REQUEST、$_POST都是null,php://input也是null
 if (isset($_FILES) && !empty($_FILES)) {
  if (move_uploaded_file($_FILES['myfile']['tmp_name'], $_FILES['myfile']['name'])) {
   echo '{"result": 1, "filename": "' . $_FILES['myfile']['name'] . '"}';
  } else {
   echo '{"result": 0}';
  }
 }

代碼的邏輯很簡單這里就不多解釋了。主要說下我在調(diào)試程序時遇到的問題,遇到的問題總結(jié)起來就一句話:當(dāng)使用FormData配合ajax上傳文件時,$_REQUEST、$_POST都是空數(shù)組,php://input也是null。

到此,關(guān)于“ajax中怎么使用FormData實現(xiàn)頁面無刷新上傳功能”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

本文標(biāo)題:ajax中怎么使用FormData實現(xiàn)頁面無刷新上傳功能
文章位置:http://muchs.cn/article18/gesegp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)全網(wǎng)營銷推廣、品牌網(wǎng)站設(shè)計關(guān)鍵詞優(yōu)化、搜索引擎優(yōu)化網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司