首頁  >  文章  >  web前端  >  Ajax怎麼實作上傳檔案的進度條Codular

Ajax怎麼實作上傳檔案的進度條Codular

php中世界最好的语言
php中世界最好的语言原創
2018-03-31 16:54:341652瀏覽

這次帶給大家Ajax怎麼實現上傳檔案的進度條Codular,Ajax實作上傳檔案的進度條Codular的注意事項有哪些,下面就是實戰案例,一起來看一下。

現在,人們喜歡在瀏覽網頁時做一些其他事情而不離開該網頁,這通常是透過ajax來實現.大多數情況,人們使用jQuery來實現,但是隨著瀏覽器的進步,人們比不需要這麼做.這裡我們將介紹如何在不離開頁面的情況下將文件上傳到伺服器,我們將使用與我們之前的文章中使用的相同的後端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('_submit'), 
_file = document.getElementById('_file'), 
_progress = document.getElementById('_progress');

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

_submit.addEventListener('click', 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('SelectedFile', _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: 'error',
        data: 'Unknown error occurred: [' + request.responseText + ']'
      };
    }
    console.log(resp.status + ': ' + resp.data);
  }
};
當請求成功後,我們用try ... catch包裹解析返回值的過程,若解析失敗,我們將創建我們自己的返回對象來使得後面的代碼能不報錯.可以自行決定如何處理返回值,這裡我們只是將其輸出至控制台.

現在我們來處理進度條:#

request.upload.addEventListener('progress', function(e){
  _progress.style.width = Math.ceil(e.loaded/e.total) * 100 + '%';
}, false);

这里有一点点复杂,我们监听一个事件,该事件对象有两个我们比较关注的属性,loaded和total.loaded表示已经上传到服务器端的数值,total表示要发送的总数值,我们可以根据这两个值计算一个百分比,来设置进度条的宽度.

Note: 这里没有加入任何动画特效,但你可以根据需要自定义动画效果.

上传文件

现在我们可以发送请求,我们将通过POST请求到一个名为upload.php的文件,并使用send()方法,参数为data,这样我们就可以发送数据:

request.open('POST', 'upload.php');
request.send(data);

下面给出完整的JavaScript代码:

var _submit = document.getElementById('_submit'), 
_file = document.getElementById('_file'), 
_progress = document.getElementById('_progress');
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('click', 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,
    'status' => $status
  )));
}
// Check for errors
if($_FILES['SelectedFile']['error'] > 0){
  outputJSON('An error ocurred when uploading.');
}
if(!getimagesize($_FILES['SelectedFile']['tmp_name'])){
  outputJSON('Please ensure you are uploading an image.');
}
// Check filetype
if($_FILES['SelectedFile']['type'] != 'image/png'){
  outputJSON('Unsupported filetype uploaded.');
}
// Check filesize
if($_FILES['SelectedFile']['size'] > 500000){
  outputJSON('File uploaded exceeds maximum upload size.');
}
// Check if the file exists
if(file_exists('upload/' . $_FILES['SelectedFile']['name'])){
  outputJSON('File with that name already exists.');
}
// Upload file
if(!move_uploaded_file($_FILES['SelectedFile']['tmp_name'], 'upload/' . $_FILES['SelectedFile']['name'])){
  outputJSON('Error uploading file - check destination is writeable.');
}
// Success!
outputJSON('File uploaded successfully to "' . 'upload/' . $_FILES['SelectedFile']['name'] . '".', 'success');

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

结束语

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

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

ajax的三级联动菜单栏如何实现

ajax数据处理步骤详解(附代码)

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn