当前位置:首页 > JavaScript

js实现批量上传

2026-01-30 10:26:10JavaScript

js实现批量上传的方法

使用HTML5的File API配合FormData对象可以实现前端批量上传文件。现代浏览器支持多文件选择和异步上传。

基本实现步骤

创建包含multiple属性的文件输入框:

js实现批量上传

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

获取文件列表并构建FormData:

const fileInput = document.getElementById('fileInput');
const formData = new FormData();

fileInput.addEventListener('change', (e) => {
  const files = e.target.files;
  for(let i = 0; i < files.length; i++) {
    formData.append('files[]', files[i]);
  }
});

使用fetch或XMLHttpRequest发送请求:

js实现批量上传

fetch('/upload', {
  method: 'POST',
  body: formData
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));

进度显示实现

XMLHttpRequest可以监听上传进度:

const xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', (e) => {
  if(e.lengthComputable) {
    const percent = Math.round((e.loaded / e.total) * 100);
    console.log(`上传进度: ${percent}%`);
  }
});
xhr.open('POST', '/upload');
xhr.send(formData);

分片上传方案

大文件可分片上传提高可靠性:

const chunkSize = 1024 * 1024; // 1MB
for(let i = 0; i < files.length; i++) {
  const file = files[i];
  let offset = 0;

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

    await fetch('/upload-chunk', {
      method: 'POST',
      body: chunkFormData
    });

    offset += chunkSize;
  }
}

第三方库推荐

  1. Dropzone.js - 提供拖拽上传和预览功能
  2. Uppy - 功能丰富的文件上传库,支持多种源
  3. Resumable.js - 实现断点续传功能

注意事项

  • 服务器需支持多文件接收处理
  • 设置合适的请求超时时间
  • 考虑文件类型和大小限制
  • 实现文件上传前的预览和验证
  • 处理并发上传时的性能问题

完整示例代码

<input type="file" id="fileInput" multiple>
<div id="progress"></div>

<script>
document.getElementById('fileInput').addEventListener('change', uploadFiles);

async function uploadFiles(e) {
  const files = e.target.files;
  const progress = document.getElementById('progress');

  for(let file of files) {
    const formData = new FormData();
    formData.append('file', file);

    try {
      const response = await fetch('/upload', {
        method: 'POST',
        body: formData,
        headers: {
          'X-File-Name': encodeURIComponent(file.name)
        }
      });

      const result = await response.json();
      progress.innerHTML += `${file.name} 上传成功<br>`;
    } catch(err) {
      progress.innerHTML += `${file.name} 上传失败: ${err.message}<br>`;
    }
  }
}
</script>

服务器端处理要点

  • 使用中间件处理multipart/form-data
  • 保存文件到指定目录
  • 返回上传结果信息
  • 实现文件重名处理逻辑
  • 记录上传日志

以上方法可根据实际需求进行调整和扩展,实现更完善的批量上传功能。

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

相关文章

vue实现批量

vue实现批量

Vue 实现批量操作的方法 在 Vue 中实现批量操作通常涉及选择多个项目并执行统一处理,例如批量删除、批量更新等。以下是几种常见实现方式: 表格多选批量操作 使用 el-table 配合复选框实现…

vue实现上传表哥

vue实现上传表哥

Vue 实现上传表格 在 Vue 中实现上传表格功能,通常涉及文件上传、文件解析(如 Excel 或 CSV)以及数据展示。以下是具体实现方法: 使用 Element UI 上传组件 Element…

jquery 上传

jquery 上传

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

jquery上传

jquery上传

jQuery 文件上传的实现方法 jQuery 可以通过多种方式实现文件上传功能,以下介绍几种常见的方法: 使用原生表单和 AJAX 通过 HTML 表单结合 jQuery 的 AJAX 功能实现…

vue实现分段上传

vue实现分段上传

实现分段上传的基本思路 分段上传(分片上传)是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能提高上传稳定性、支持断点续传,并减轻服务器压力。 前端实现步骤 安装依赖 需要axio…

vue上传视频实现

vue上传视频实现

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