深入理解axios.onUploadProgress

在現代 Web 開發中,文件上傳已經成為了非常常見的需求。然而,由於文件大小的限制等問題,文件上傳不一定能夠一次性完成,這就需要我們使用實時反饋上傳進度的功能 – axios.onUploadProgress。本文將從多個方面深入理解 axios.onUploadProgress,並且提供詳細的代碼示例。

一、axios.onUploadProgress 基礎用法

axios 是一款基於 Promise 的 HTTP 庫,它可以用於瀏覽器和 Node.js。axios.onUploadProgress 屬性用於監聽上傳進度,以下是基礎使用方法:

axios({
    method: 'post',
    url: '/upload',
    data: formData,
    onUploadProgress: function(progressEvent) {
        console.log(progressEvent.loaded / progressEvent.total * 100 + "%");
    }
});

這段代碼中,我們通過傳遞一個包含 onUploadProgress 屬性的配置對象,可以實現上傳進度的監聽功能。回調函數中的 progressEvent 包含了多個屬性,其中 loaded 表示已上傳的字節數,total 表示文件總大小。

二、處理上傳進度條

基本上,我們不可能僅僅通過 console.log 將上傳進度打印到控制台,而是需要將它展現給用戶。下面是一個簡單的上傳進度條示例,使用了前端框架 Vue.js,核心邏輯是在監聽到 onUploadProgress 事件時更新進度條寬度。

<html>
<body>
    <div id="app">
        <input type="file" @change="uploadFile">
        <div class="progress-bar"></div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                progress: 0
            },
            methods: {
                uploadFile(event) {
                    let formData = new FormData();
                    formData.append("file", event.target.files[0]);

                    let config = {
                        onUploadProgress: progressEvent => {
                            let progress = Math.round(
                                (progressEvent.loaded * 100) / progressEvent.total
                            );
                            this.progress = progress;
                        }
                    };

                    axios
                        .post('/upload', formData, config)
                        .then(res => {
                            console.log(res.data);
                        })
                        .catch(err => {
                            console.log(err);
                        });
                }
            }
        });
    </script>
</body>
</html>

該例中,我們通過在 data 對象中添加 progress 屬性,Vue.js 就可以響應式地更新進度條的寬度,其餘代碼邏輯與之前給出的基礎用法相同。

三、並發上傳文件時如何監聽進度

實際上,我們可以監聽多個文件的上傳進度。以下是一個示例,它使用了 Promise.all 和 axios 的並發功能:

let files = [...document.querySelector('input[type=file]').files];
let data = new FormData();

files.forEach((file, index) => {
    data.append('files[]', file);
});

let config = {
    onUploadProgress: function(progressEvent) {
        var percentCompleted = Math.round(
            (progressEvent.loaded * 100) / progressEvent.total
        );
        console.log(percentCompleted);
    }
};

axios
    .post('/upload', data, config)
    .then(res => {
        console.log(res.data);
    })
    .catch(err => {
        console.log(err);
    });

如上述代碼所示,我們可以將文件數組遍歷一遍,將每個文件依次加到 FormData 對象中,同時在配置對象中增加 onUploadProgress 屬性,就可以監聽到多個文件的上傳進度。

四、處理大文件上傳

有時,我們需要上傳非常大的文件,例如視頻或者音頻文件,這些文件可能會非常耗費時間。如果上傳時間超過了服務器的限制,那麼上傳可能會失敗。解決這個問題的常用方法是,將文件切割成多個部分,每一部分單獨上傳。

let file = document.querySelector('input[type=file]').files[0];

const BYTES_PER_CHUNK = 1024 * 1024; // 1MB
const SIZE = file.size;
const CHUNKS_COUNT = Math.ceil(SIZE / BYTES_PER_CHUNK);

let promises = [];

for (let index = 0; index  {
        console.log(results);
    })
    .catch(error => {
        console.log(error);
    });

在上述代碼示例中,我們將文件切割成了 CHUNKS_COUNT 個部分,並將它們分別進行上傳。每個部分的大小為 BYTES_PER_CHUNK。這個值可以自行設定,這裡我們設置為了 1MB。在上傳時,每個部分單獨使用 FormData 進行上傳,最後使用 Promise.all 等待所有上傳任務都完成。

五、結論

本文從多個方面深入理解了 axios.onUploadProgress,分別介紹了它的基礎用法、如何處理上傳進度條、並發上傳文件時如何監聽進度以及如何處理大文件上傳。在項目開發中,我們需要根據實際需求靈活運用這些技巧,以提高開發效率和用戶體驗。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/207027.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-08 14:19
下一篇 2024-12-08 14:20

相關推薦

  • 使用axios獲取返回圖片

    使用axios獲取返回圖片是Web開發中很常見的需求。本文將介紹如何使用axios獲取返回圖片,並從多個方面進行詳細闡述。 一、安裝axios 使用axios獲取返回圖片前,首先需…

    編程 2025-04-29
  • Axios請求數據亂碼問題解決

    本文將從以下三個方面詳細闡述Axios請求數據亂碼問題的原因和解決方法: 一、設置請求頭 Axios請求數據亂碼的原因可能是因為請求時沒有設置請求頭的編碼方式,而且默認的編碼方式是…

    編程 2025-04-28
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r為前綴的字符串。r字符串中的反斜杠(\)不會被轉義,而是被當作普通字符處理,這使得r字符串可以非常方便…

    編程 2025-04-25

發表回復

登錄後才能評論