当前位置:首页 > JavaScript

js实现上传进度条

2026-03-01 03:35:39JavaScript

实现上传进度条的方法

XMLHttpRequest 方法

使用 XMLHttpRequest 对象的 upload 属性监听进度事件。XMLHttpRequest 提供了 progress 事件,可以实时获取上传进度。

js实现上传进度条

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.open('POST', '/upload', true);
xhr.send(new FormData(fileInput));

Fetch API 方法

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

js实现上传进度条

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

async function uploadWithProgress(file) {
  const reader = file.stream().getReader();
  let totalUploaded = 0;

  const stream = new ReadableStream({
    async pull(controller) {
      const { done, value } = await reader.read();
      if (done) {
        controller.close();
        return;
      }
      totalUploaded += value.length;
      const percentComplete = (totalUploaded / file.size) * 100;
      progressBar.style.width = `${percentComplete}%`;
      progressBar.textContent = `${Math.round(percentComplete)}%`;
      controller.enqueue(value);
    }
  });

  await fetch('/upload', {
    method: 'POST',
    headers: { 'Content-Type': 'application/octet-stream' },
    body: stream
  });
}

fileInput.addEventListener('change', () => {
  uploadWithProgress(fileInput.files[0]);
});

Axios 方法

Axios 提供了 onUploadProgress 回调函数,可以方便地跟踪上传进度。

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

const uploadFile = (file) => {
  const formData = new FormData();
  formData.append('file', file);

  axios.post('/upload', formData, {
    onUploadProgress: (progressEvent) => {
      const percentComplete = Math.round((progressEvent.loaded * 100) / progressEvent.total);
      progressBar.style.width = `${percentComplete}%`;
      progressBar.textContent = `${percentComplete}%`;
    }
  });
};

fileInput.addEventListener('change', () => {
  uploadFile(fileInput.files[0]);
});

使用第三方库

一些第三方库如 uppydropzone 提供了内置的上传进度功能。

const uppy = new Uppy({
  restrictions: {
    maxFileSize: 1000000,
    maxNumberOfFiles: 3,
    allowedFileTypes: ['image/*']
  }
});

uppy.use(Dashboard, {
  inline: true,
  target: '#upload-container'
});

uppy.use(XHRUpload, {
  endpoint: '/upload',
  fieldName: 'file'
});

uppy.on('upload-progress', (file, progress) => {
  console.log(file.id, progress.percent);
});

注意事项

  • 确保服务器支持分块上传或正确处理上传进度。
  • 对于大文件上传,考虑使用分块上传以减少内存占用。
  • 跨域请求时,服务器需要配置 CORS 头部以允许进度事件。

以上方法可以根据项目需求和技术栈选择适合的实现方式。

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

相关文章

vue实现文档上传

vue实现文档上传

Vue 实现文档上传的方法 使用原生 HTML 表单和 Vue 处理文件上传 在 Vue 中可以通过原生 HTML 的 <input type="file"> 元素结合 Vue 的数据绑定…

vue实现视频上传管理

vue实现视频上传管理

视频上传管理实现方案 前端部分(Vue.js) 使用<input type="file">元素配合<video>标签实现基础上传和预览功能: <template>…

vue实现上传视频

vue实现上传视频

使用 <input type="file"> 实现基础上传 通过 HTML 原生文件选择控件获取视频文件,结合 Vue 处理上传逻辑。 <template> <…

vue实现语音上传

vue实现语音上传

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

vue实现切片上传

vue实现切片上传

切片上传的实现原理 切片上传是将大文件分割成多个小块(切片)分别上传,最后在服务端合并。这种方式能提高上传效率、支持断点续传和并发上传。 前端实现步骤 使用Vue实现切片上传需要借助File对象的s…

Vue实现图片批量上传

Vue实现图片批量上传

Vue 图片批量上传实现方法 准备工作 安装必要依赖(如axios、element-ui等),确保项目基于Vue 2/3环境。以Vue 3 + Element Plus为例: npm install…