当前位置:首页 > 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实现类似功能。

js实现上传进度条

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结构可以简单实现为:

js实现上传进度条

<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示例:

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');
});

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

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

相关文章

h5实现进度条

h5实现进度条

使用HTML5的<progress>标签 HTML5提供了原生进度条标签<progress>,适用于展示任务完成进度。基本语法如下: <progress value="…

php实现视频上传

php实现视频上传

视频上传功能实现 使用PHP实现视频上传功能需要处理文件接收、验证、存储等步骤。以下是具体实现方法: 创建HTML表单 前端表单需要设置enctype="multipart/form-data"以支…

jquery 进度条

jquery 进度条

jQuery 进度条实现方法 使用 jQuery 可以轻松创建和管理进度条,以下是几种常见的实现方式: 使用 HTML5 <progress> 元素 jQuery 可以操作 HTML5…

vue实现语音上传

vue实现语音上传

实现语音上传功能 在Vue中实现语音上传功能需要结合浏览器的Web Audio API和文件上传逻辑。以下是一个完整的实现方案: 录音功能实现 安装依赖库recorder-core和wav编码器:…

vue实现进度条

vue实现进度条

Vue 实现进度条的方法 使用原生 HTML 和 CSS 结合 Vue 数据绑定 创建一个简单的进度条,通过 Vue 的数据绑定动态控制进度值。 <template> <div…

Vue实现头像截取上传

Vue实现头像截取上传

Vue实现头像截取上传的方法 使用Vue实现头像截取上传功能,可以通过以下步骤完成。主要依赖第三方库vue-cropper或cropperjs实现图像裁剪功能,结合文件上传逻辑完成整个流程。 安装依…