当前位置:首页 > JavaScript

js实现上传进度条

2026-04-04 04:09:39JavaScript

实现上传进度条的方法

在JavaScript中,可以通过监听XMLHttpRequest或Fetch API的上传事件来实现上传进度条。以下是两种常见的方法:

使用XMLHttpRequest实现上传进度条

XMLHttpRequest提供了upload属性,可以监听上传进度事件。

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

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

xhr.addEventListener('load', () => {
    console.log('上传完成');
});

xhr.addEventListener('error', () => {
    console.error('上传失败');
});

xhr.open('POST', '/upload', true);
const formData = new FormData();
formData.append('file', fileInput.files[0]);
xhr.send(formData);

使用Fetch API实现上传进度条

Fetch API本身不直接支持进度事件,但可以通过结合ReadableStream和TransformStream实现。

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

const file = fileInput.files[0];
const reader = file.stream().getReader();
let uploaded = 0;

const stream = new ReadableStream({
    async start(controller) {
        while (true) {
            const { done, value } = await reader.read();
            if (done) {
                controller.close();
                break;
            }
            uploaded += value.length;
            const percentComplete = (uploaded / file.size) * 100;
            progressBar.style.width = percentComplete + '%';
            progressBar.textContent = Math.round(percentComplete) + '%';
            controller.enqueue(value);
        }
    }
});

fetch('/upload', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/octet-stream',
    },
    body: stream,
}).then(response => {
    console.log('上传完成');
}).catch(error => {
    console.error('上传失败', error);
});

使用第三方库实现上传进度条

如果需要更简单的实现,可以考虑使用第三方库如axios或jQuery。

js实现上传进度条

使用axios实现上传进度条

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

const formData = new FormData();
formData.append('file', fileInput.files[0]);

axios.post('/upload', formData, {
    onUploadProgress: (progressEvent) => {
        const percentComplete = (progressEvent.loaded / progressEvent.total) * 100;
        progressBar.style.width = percentComplete + '%';
        progressBar.textContent = Math.round(percentComplete) + '%';
    }
}).then(response => {
    console.log('上传完成');
}).catch(error => {
    console.error('上传失败', error);
});

注意事项

  • 确保服务器支持接收上传的文件,并正确处理进度事件。
  • 对于大文件上传,建议分片上传以减少失败的风险。
  • 进度条的样式可以根据需求自定义,例如使用CSS动画增强用户体验。

以上方法可以根据项目需求选择适合的实现方式。XMLHttpRequest兼容性较好,Fetch API更适合现代浏览器,第三方库则提供了更简洁的API。

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

相关文章

vue实现进度条

vue实现进度条

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

vue进度条实现

vue进度条实现

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

vue怎么实现视频上传

vue怎么实现视频上传

实现视频上传功能 在Vue中实现视频上传功能通常需要结合HTML5的<input type="file">元素和后端API。以下是实现方法: 前端实现 创建文件上传组件模板: <…

vue实现拍摄视频上传

vue实现拍摄视频上传

Vue实现拍摄视频上传的方法 使用HTML5的<input type="file">和capture属性 在Vue模板中添加一个文件输入元素,通过capture属性指定使用摄像头拍摄视频:…

react实现头像上传

react实现头像上传

实现头像上传功能 使用React实现头像上传功能需要结合文件输入、图片预览和上传逻辑。以下是一个完整的实现方案: 创建上传组件 创建一个React组件来处理头像上传功能,包含文件选择和预览功能:…

react实现视频分片上传

react实现视频分片上传

实现视频分片上传的基本思路 视频分片上传的核心是将大文件切割为多个小块(chunk),分别上传到服务器,最后由服务器合并。这种方法能提高上传稳定性、支持断点续传,并减少网络波动的影响。 前端实现步骤…