当前位置:首页 > JavaScript

js实现上传进度条

2026-01-30 12:30:32JavaScript

使用XMLHttpRequest实现上传进度条

XMLHttpRequest是传统的AJAX请求方式,支持上传进度监控。通过监听upload对象的progress事件获取上传进度信息。

const xhr = new XMLHttpRequest();
const fileInput = document.getElementById('fileInput');
const progressBar = document.getElementById('progressBar');

fileInput.addEventListener('change', function(e) {
    const file = e.target.files[0];
    const formData = new FormData();
    formData.append('file', file);

    xhr.upload.addEventListener('progress', function(e) {
        if (e.lengthComputable) {
            const percent = Math.round((e.loaded / e.total) * 100);
            progressBar.style.width = percent + '%';
            progressBar.textContent = percent + '%';
        }
    });

    xhr.open('POST', '/upload', true);
    xhr.send(formData);
});

使用Fetch API实现上传进度条

Fetch API本身不直接支持进度监控,但可以通过ReadableStreamTransformStream实现类似功能。

const fileInput = document.getElementById('fileInput');
const progressBar = document.getElementById('progressBar');

fileInput.addEventListener('change', async function(e) {
    const file = e.target.files[0];
    const formData = new FormData();
    formData.append('file', file);

    const response = await fetch('/upload', {
        method: 'POST',
        body: formData,
        headers: {
            'Content-Type': 'multipart/form-data'
        }
    });

    const reader = response.body.getReader();
    const contentLength = +response.headers.get('Content-Length');
    let receivedLength = 0;

    while(true) {
        const {done, value} = await reader.read();
        if (done) break;

        receivedLength += value.length;
        const percent = Math.round((receivedLength / contentLength) * 100);
        progressBar.style.width = percent + '%';
        progressBar.textContent = percent + '%';
    }
});

使用Axios实现上传进度条

Axios提供了更简洁的进度监控方式,通过onUploadProgress回调函数实现。

const fileInput = document.getElementById('fileInput');
const progressBar = document.getElementById('progressBar');

fileInput.addEventListener('change', function(e) {
    const file = e.target.files[0];
    const formData = new FormData();
    formData.append('file', file);

    axios.post('/upload', formData, {
        headers: {
            'Content-Type': 'multipart/form-data'
        },
        onUploadProgress: function(progressEvent) {
            const percent = Math.round((progressEvent.loaded / progressEvent.total) * 100);
            progressBar.style.width = percent + '%';
            progressBar.textContent = percent + '%';
        }
    });
});

进度条UI实现

HTML结构可以简单实现为:

<input type="file" id="fileInput">
<div class="progress-container">
    <div id="progressBar" class="progress-bar">0%</div>
</div>

CSS样式示例:

.progress-container {
    width: 100%;
    height: 20px;
    background-color: #f0f0f0;
    margin-top: 10px;
    border-radius: 10px;
    overflow: hidden;
}

.progress-bar {
    height: 100%;
    width: 0%;
    background-color: #4CAF50;
    text-align: center;
    line-height: 20px;
    color: white;
    transition: width 0.3s;
}

注意事项

后端服务器需要正确配置才能支持文件上传和进度监控。Node.js Express示例:

js实现上传进度条

const express = require('express');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
    res.send('File uploaded successfully');
});

对于大文件上传,建议实现分片上传功能,将大文件分割为多个小块分别上传,提高可靠性和用户体验。

标签: 进度条上传
分享给朋友:

相关文章

vue上传视频实现

vue上传视频实现

使用 <input type="file"> 上传视频 创建文件选择控件,限制文件类型为视频格式(如 .mp4, .webm)。通过 @change 事件监听文件选择,获取 File 对象…

vue实现批量上传

vue实现批量上传

Vue 实现批量上传的方法 使用 <input type="file"> 和 multiple 属性 在 Vue 模板中添加一个文件输入框,设置 multiple 属性以允许选择多个文件。…

vue实现音乐上传

vue实现音乐上传

Vue 实现音乐上传功能 音乐上传功能通常涉及前端界面交互、文件选择、上传进度显示以及后端接口对接。以下是基于 Vue 的实现方法: 前端界面设计 使用 Vue 的模板语法创建一个简单的上传界面,包…

vue用户实现头像上传

vue用户实现头像上传

前端实现头像上传(Vue + Element UI) 环境准备 确保项目已安装element-ui和axios(或其他HTTP库): npm install element-ui axios 组件代…

vue实现上传预览功能

vue实现上传预览功能

Vue实现上传预览功能 基本文件上传组件 使用<input type="file">获取文件,通过FileReader读取文件内容: <template> <div…

vue进度条实现

vue进度条实现

Vue 进度条实现方法 在Vue中实现进度条可以通过多种方式完成,以下是几种常见的方法: 使用HTML5原生进度条 HTML5提供了<progress>标签,可以快速实现一个简单的进度条…