首頁 web前端 js教程 Ajax上傳檔案進度條Codular

Ajax上傳檔案進度條Codular

May 22, 2018 pm 02:49 PM
ajax 進度

這篇文章主要介紹了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(&#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;);
登入後複製
上面是我整理給大家的,希望未來會對大家有幫助。

相關文章:

jQuery Validator驗證Ajax提交表單的方法和Ajax傳參的方法(圖文教學)

Ajax非同步請求技術實例講解

Ajax跨域請求的原理(圖文教學)

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

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

解決jQuery AJAX請求遇到403錯誤的方法 解決jQuery AJAX請求遇到403錯誤的方法 Feb 20, 2024 am 10:07 AM

標題:解決jQueryAJAX請求出現403錯誤的方法及程式碼範例403錯誤是指伺服器禁止存取資源的請求,通常會導致出現這個錯誤的原因是請求缺少權限或被伺服器拒絕。在進行jQueryAJAX請求時,有時會遇到這種情況,本文將介紹如何解決這個問題,並提供程式碼範例。解決方法:檢查權限:首先要確保請求的URL位址是正確的,同時驗證是否有足夠的權限來存取該資

PHP 與 Ajax:建立一個自動完成建議引擎 PHP 與 Ajax:建立一個自動完成建議引擎 Jun 02, 2024 pm 08:39 PM

使用PHP和Ajax建置自動完成建議引擎:伺服器端腳本:處理Ajax請求並傳回建議(autocomplete.php)。客戶端腳本:發送Ajax請求並顯示建議(autocomplete.js)。實戰案例:在HTML頁面中包含腳本並指定search-input元素識別碼。

解決jQuery AJAX請求403錯誤的方法 解決jQuery AJAX請求403錯誤的方法 Feb 19, 2024 pm 05:55 PM

jQuery是一個受歡迎的JavaScript函式庫,用來簡化客戶端端的開發。而AJAX則是在不重新載入整個網頁的情況下,透過發送非同步請求和與伺服器互動的技術。然而在使用jQuery進行AJAX請求時,有時會遇到403錯誤。 403錯誤通常是伺服器禁止存取的錯誤,可能是由於安全性原則或權限問題導致的。在本文中,我們將討論如何解決jQueryAJAX請求遭遇403錯誤

如何解決jQuery AJAX報錯403的問題? 如何解決jQuery AJAX報錯403的問題? Feb 23, 2024 pm 04:27 PM

如何解決jQueryAJAX報錯403的問題?在開發網頁應用程式時,經常會使用jQuery來發送非同步請求。然而,有時在使用jQueryAJAX時可能會遇到錯誤代碼403,表示伺服器禁止存取。這種情況通常是由伺服器端的安全性設定所導致的,但可以透過一些方法來解決這個問題。本文將介紹如何解決jQueryAJAX報錯403的問題,並提供具體的程式碼範例。一、使

如何使用Ajax從PHP方法取得變數? 如何使用Ajax從PHP方法取得變數? Mar 09, 2024 pm 05:36 PM

使用Ajax從PHP方法取得變數是Web開發中常見的場景,透過Ajax可以實作頁面無需刷新即可動態取得資料。在本文中,將介紹如何使用Ajax從PHP方法中取得變量,並提供具體的程式碼範例。首先,我們需要寫一個PHP檔案來處理Ajax請求,並傳回所需的變數。下面是一個簡單的PHP檔案getData.php的範例程式碼:

PHP 與 Ajax:建立動態載入內容的解決方案 PHP 與 Ajax:建立動態載入內容的解決方案 Jun 06, 2024 pm 01:12 PM

Ajax(非同步JavaScript和XML)允許在不重新載入頁面情況下新增動態內容。使用PHP和Ajax,您可以動態載入產品清單:HTML建立一個帶有容器元素的頁面,Ajax請求載入資料後將資料加入到該元素中。 JavaScript使用Ajax透過XMLHttpRequest向伺服器傳送請求,從伺服器取得JSON格式的產品資料。 PHP使用MySQL從資料庫查詢產品數據,並將其編碼為JSON格式。 JavaScript解析JSON數據,並將其顯示在頁面容器中。點選按鈕觸發Ajax請求,載入產品清單。

PHP 與 Ajax:提升 Ajax 安全性的方法 PHP 與 Ajax:提升 Ajax 安全性的方法 Jun 01, 2024 am 09:34 AM

為了提升Ajax安全性,有幾種方法:CSRF保護:產生令牌並將其傳送到客戶端,在請求中新增至伺服器端進行驗證。 XSS保護:使用htmlspecialchars()過濾輸入,防止惡意腳本注入。 Content-Security-Policy頭:限制惡意資源加載,指定允許載入腳本和樣式表的來源。驗證伺服器端輸入:驗證從Ajax請求接收的輸入,防止攻擊者利用輸入漏洞。使用安全Ajax函式庫:利用jQuery等函式庫提供的自動CSRF保護模組。

ajax版本有哪些 ajax版本有哪些 Nov 22, 2023 pm 02:00 PM

ajax不是一個特定的版本,而是一種使用多種技術的集合來非同步載入和更新網頁內容的技術。 ajax沒有特定的版本號,但是有一些ajax的變體或擴充:1、jQuery AJAX;2、Axios;3、Fetch API;4、JSONP;5、XMLHttpRequest Level 2;6、WebSockets;7、Server-Sent Events;8、GraphQL等等。

See all articles