当前位置:首页 > JavaScript

js实现批量上传

2026-03-01 01:30:51JavaScript

批量上传的实现方法

使用JavaScript实现批量上传功能通常涉及文件选择、文件处理和上传三个核心环节。以下是常见的实现方案:

文件选择与处理 使用HTML5的<input type="file">元素并设置multiple属性允许选择多个文件:

<input type="file" id="fileInput" multiple>

通过JavaScript获取文件列表并验证:

const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', (event) => {
  const files = Array.from(event.target.files);
  // 验证文件类型/大小等
  files.forEach(file => {
    if(file.size > 10 * 1024 * 1024) {
      alert('文件大小超过限制');
      return;
    }
  });
});

分片上传处理 对于大文件可进行分片上传:

function uploadChunk(file, chunkSize = 5 * 1024 * 1024) {
  let offset = 0;
  const chunks = Math.ceil(file.size / chunkSize);

  while(offset < file.size) {
    const chunk = file.slice(offset, offset + chunkSize);
    const formData = new FormData();
    formData.append('chunk', chunk);
    formData.append('name', file.name);
    formData.append('index', offset / chunkSize);

    fetch('/upload', {
      method: 'POST',
      body: formData
    }).then(response => {
      // 处理响应
    });
    offset += chunkSize;
  }
}

并发控制 避免同时上传过多文件导致性能问题:

async function batchUpload(files, maxConcurrent = 3) {
  const queue = [];
  for(let i=0; i<files.length; i++) {
    const task = uploadFile(files[i]).then(() => {
      queue.splice(queue.indexOf(task), 1);
    });
    queue.push(task);
    if(queue.length >= maxConcurrent) {
      await Promise.race(queue);
    }
  }
  await Promise.all(queue);
}

进度显示 通过XMLHttpRequest或fetch API的进度事件:

function uploadWithProgress(file) {
  const xhr = new XMLHttpRequest();
  xhr.upload.addEventListener('progress', (e) => {
    const percent = Math.round((e.loaded / e.total) * 100);
    updateProgressBar(file.name, percent);
  });
  xhr.open('POST', '/upload');
  xhr.send(file);
}

完整示例

js实现批量上传

document.getElementById('uploadBtn').addEventListener('click', async () => {
  const files = document.getElementById('fileInput').files;
  if(files.length === 0) return;

  try {
    await batchUpload(Array.from(files));
    alert('所有文件上传完成');
  } catch(error) {
    console.error('上传出错:', error);
  }
});

注意事项

  • 服务端需要支持多文件接收和处理
  • 对于大文件应考虑断点续传机制
  • 需要处理网络中断等异常情况
  • 跨域上传需要配置CORS
  • 生产环境建议使用成熟的上传库如Dropzone.js、Uppy等

以上方案可根据实际需求进行组合和调整,核心在于文件处理、并发控制和用户体验的平衡。

标签: 批量上传
分享给朋友:

相关文章

jquery 上传

jquery 上传

jQuery 文件上传方法 使用 jQuery 实现文件上传可以通过多种方式完成,以下是常见的几种方法: 使用原生表单和 AJAX 创建一个包含文件输入的表单,并通过 jQuery 的 AJAX…

vue上传视频实现

vue上传视频实现

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

vue实现批量打印

vue实现批量打印

实现思路 在Vue中实现批量打印功能,通常需要结合浏览器的打印API和前端模板渲染。核心步骤包括数据准备、模板设计、打印触发和样式控制。以下是具体实现方法: 数据准备与模板设计 确保有一个包含所有需…

vue实现上传进度

vue实现上传进度

Vue 实现文件上传进度 在 Vue 中实现文件上传进度可以通过 XMLHttpRequest 或 axios 的 onUploadProgress 事件来监听上传进度。以下是两种常见实现方式: 使…

vue怎么实现视频上传

vue怎么实现视频上传

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

vue实现多图片上传

vue实现多图片上传

Vue 多图片上传实现 基本文件上传组件 创建基于<input type="file">的基础组件,支持多选: <template> <div> &l…