實例分享Ajax上傳檔案進度條Codular

小云云
發布: 2023-03-18 14:06:02
原創
1508 人瀏覽過

現在,人們喜歡在瀏覽網頁時做一些其他事情而不離開該網頁,這通常是透過ajax來實現.大多數情況,人們使用jQuery來實現,但是隨著瀏覽器的進步,人們比不需要這麼做,本文主要介紹了Ajax上傳文件進度條Codular的相關資料,需要的朋友可以參考下,希望能幫助到大家。

這裡我們將介紹如何在不離開頁面的情況下將文件上傳到伺服器,我們將使用與我們之前的文章中使用的相同的後端PHP代碼. 該腳本將上傳文件至伺服器,同時顯示上傳進度,並最終返回上傳文件的連結地址.在某些情況下,你可能想要返回上傳文件的id或其他的應用信息. Note: 該代碼不支援較老的ie瀏覽器,通過Can I use我們只支援ie10+

Let's Code

我們將從HTML結構開始,然後是JavaScript,然後我將提供您PHP程式碼,這部分改編於之前教程- 對PHP程式碼將不會有太多的解釋。

HTML

我們只需要使用兩個輸入框,一個是檔案類型file,另一個只是一個按鈕button,以便我們可以監聽到它被點擊發送文件上傳請求。 我們還將有一個p,我們改變寬度以突出顯示上傳的狀態。

如下所示:


<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS File Upload with Progress</title>
  <style>
  .container {
    width: 500px;
    margin: 0 auto;
  }
  .progress_outer {
    border: 1px solid #000;
  }
  .progress {
    width: 20%;
    background: #DEDEDE;
    height: 20px; 
  }
  </style>
</head>
<body>
  <p class=&#39;container&#39;>
    <p>
      Select File: <input type=&#39;file&#39; id=&#39;_file&#39;> <input type=&#39;button&#39; id=&#39;_submit&#39; value=&#39;Upload!&#39;>
    </p>
    <p class=&#39;progress_outer&#39;>
      <p id=&#39;_progress&#39; class=&#39;progress&#39;></p>
    </p>
  </p>
  <script src=&#39;upload.js&#39;></script>
</body>
</html>
登入後複製

你將看到我們寫了一點進度條樣式,並在底部加入腳本文件來處理文件上傳以及進度條展示.

JavaScript

#首先, 我們需要拿到我們將要使用的標籤,他們已經用id標記上.


#
var _submit = document.getElementById(&#39;_submit&#39;), 
_file = document.getElementById(&#39;_file&#39;), 
_progress = document.getElementById(&#39;_progress&#39;);
登入後複製

下一步,給_submit添加點擊事件,用以上傳我們選擇的檔案.為此,我們將使用addEventListener方法,點擊按鈕後讓其呼叫upload方法.


_submit.addEventListener(&#39;click&#39;, upload);
登入後複製

現在我們可以繼續處理上傳,有以下幾步:

  1. #檢查被選取的檔案

  2. 動態建立要傳送的檔案資料

  3. 透過js建立XMLHttpRequest

  4. 上傳檔案


##檢查被選中的檔案

我們的檔案輸入框_file有一個查詢被選中檔案佇列的參數files-如果你設定了multiple參數將可以選多個檔案.我們做簡單的檢查判斷,如果該數組長度大於0,則繼續,否則直接返回.


if(_file.files.length === 0){
  return;
}
登入後複製

現在,我們能確保已選擇一個文件,我們將假定有一個文件,請記著數組的索引以0開頭.

動態創建要發送的文件資料

為此,我們需要使用FormData,並將資料加入其中.下一步,我們可以在步驟3產生的request中發送我們的FormData.我們使用的append方法,第一個參數與輸入框的name屬性相似,第二個參數是值value. 這裡,我們將value設為我們選擇的第一個檔案.

var data = new FormData();
data.append(&#39;SelectedFile&#39;, _file.files[0]);
登入後複製

當稍後向服務端發送資料時,我們將使用它.


透過上傳腳本建立XMLHttpRequest

這部分是非常基礎的,我們將建立一個新的

XMLHttpRequest,並設定一些設定。首先我們將修改onreadystatechange

的值來定義請求狀態改變時的回呼函數.該方法將會在狀態改變時檢查readyState,確保該值是我們想要的-在這個例子中就是4,代表請求完成.


第二步,我們將在upload屬性上新增progress事件.這樣我們能得到上傳進度用來更新進度條.

var request = new XMLHttpRequest();
request.onreadystatechange = function(){
  if(request.readyState == 4){
    try {
      var resp = JSON.parse(request.response);
    } catch (e){
      var resp = {
        status: &#39;error&#39;,
        data: &#39;Unknown error occurred: [&#39; + request.responseText + &#39;]&#39;
      };
    }
    console.log(resp.status + &#39;: &#39; + resp.data);
  }
};
登入後複製

當請求成功後,我們用try ... catch包裹解析返回值的過程,若解析失敗,我們將創建我們自己的返回對象來使得後面的代碼能不報錯.可以自行決定如何處理返回值,這裡我們只是將其輸出至控制台.

現在我們來處理進度條:


#

request.upload.addEventListener(&#39;progress&#39;, function(e){
  _progress.style.width = Math.ceil(e.loaded/e.total) * 100 + &#39;%&#39;;
}, false);
登入後複製

這裡有一點點複雜,我們監聽一個事件,該事件物件有兩個我們比較關注的屬性,loaded和total.loaded表示已經上傳到伺服器端的數值,total表示要發送的總數值,我們可以根據這兩個值計算一個百分比,來設定進度條的寬度.

Note: 這裡沒有加入任何動畫特效,但你可以根據需要自訂動畫效果.


上傳檔案

現在我們可以發送請求,我們將透過POST請求到一個名為upload.php的文件,並使用send()方法,參數為data,這樣我們就可以發送資料:

request.open(&#39;POST&#39;, &#39;upload.php&#39;);
request.send(data);
登入後複製

下面給出完整的JavaScript程式碼:


###
var _submit = document.getElementById(&#39;_submit&#39;), 
_file = document.getElementById(&#39;_file&#39;), 
_progress = document.getElementById(&#39;_progress&#39;);
var upload = function(){
  if(_file.files.length === 0){
    return;
  }
  var data = new FormData();
  data.append('SelectedFile', _file.files[0]);
  var request = new XMLHttpRequest();
  request.onreadystatechange = function(){
    if(request.readyState == 4){
      try {
        var resp = JSON.parse(request.response);
      } catch (e){
        var resp = {
          status: 'error',
          data: 'Unknown error occurred: [' + request.responseText + ']'
        };
      }
      console.log(resp.status + ': ' + resp.data);
    }
  };
  request.upload.addEventListener('progress', function(e){
    _progress.style.width = Math.ceil(e.loaded/e.total) * 100 + '%';
  }, false);
  request.open('POST', 'upload.php');
  request.send(data);
}
_submit.addEventListener(&#39;click&#39;, upload);
登入後複製
###現在到了PHP...#########PHP### ######這是我們使用的程式碼,你將注意到一些區別,主要是我們用最上面的JSON方法來傳回值都作為JSON格式輸出.這個PHP與之前文章中的程式碼相同,這也就意味著該方法只適用於小於500Kb的PNG圖片.此外,成功訊息將返回已上傳檔案的路徑:############
<?php
// Output JSON
function outputJSON($msg, $status = &#39;error&#39;){
  header(&#39;Content-Type: application/json&#39;);
  die(json_encode(array(
    &#39;data&#39; => $msg,
    &#39;status&#39; => $status
  )));
}
// Check for errors
if($_FILES[&#39;SelectedFile&#39;][&#39;error&#39;] > 0){
  outputJSON(&#39;An error ocurred when uploading.&#39;);
}
if(!getimagesize($_FILES[&#39;SelectedFile&#39;][&#39;tmp_name&#39;])){
  outputJSON(&#39;Please ensure you are uploading an image.&#39;);
}
// Check filetype
if($_FILES[&#39;SelectedFile&#39;][&#39;type&#39;] != &#39;image/png&#39;){
  outputJSON(&#39;Unsupported filetype uploaded.&#39;);
}
// Check filesize
if($_FILES[&#39;SelectedFile&#39;][&#39;size&#39;] > 500000){
  outputJSON(&#39;File uploaded exceeds maximum upload size.&#39;);
}
// Check if the file exists
if(file_exists(&#39;upload/&#39; . $_FILES[&#39;SelectedFile&#39;][&#39;name&#39;])){
  outputJSON(&#39;File with that name already exists.&#39;);
}
// Upload file
if(!move_uploaded_file($_FILES[&#39;SelectedFile&#39;][&#39;tmp_name&#39;], &#39;upload/&#39; . $_FILES[&#39;SelectedFile&#39;][&#39;name&#39;])){
  outputJSON(&#39;Error uploading file - check destination is writeable.&#39;);
}
// Success!
outputJSON(&#39;File uploaded successfully to "&#39; . &#39;upload/&#39; . $_FILES[&#39;SelectedFile&#39;][&#39;name&#39;] . &#39;".&#39;, &#39;success&#39;);
登入後複製

如果将所有内容都放在一起,您应该可以将文件上传到您期望的位置,并在浏览器的控制台内成功返回。

结束语

还有一些比较容易而又有效的方式来增强用户体验.通过将文件队列的多个文件加入到FormData,可以实现多文件上传. 有一点要说明,如果你是在本地做测试,你可能没办法看到进度条逐步变化,这取决于你本地机器的上传速度,我建议在服务器上使用较大的png文件做测试.

相关推荐:

PHP利用APC模块实现上传进度条的实例分享

实例讲解Ajax实现简单带百分比进度条

JavaScript控制进度条的实例分析

以上是實例分享Ajax上傳檔案進度條Codular的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!