当前位置:首页 > 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 中实现文件上传功能可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的数据绑定和事件处理来实现。以下是几种常见的实现…

vue实现切片上传

vue实现切片上传

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

vue实现批量选择li怎么实现

vue实现批量选择li怎么实现

Vue 实现批量选择列表项的方法 在 Vue 中实现批量选择列表项(<li>)通常涉及数据绑定、事件处理和状态管理。以下是几种常见的实现方式: 方法一:基于 v-model 和复选框 通…

vue实现上传功能

vue实现上传功能

实现文件上传功能 在Vue中实现文件上传功能可以通过结合HTML的<input type="file">元素和JavaScript的FormData对象来完成。以下是一个基本的实现方法:…

React批量删除实现

React批量删除实现

React批量删除的实现方法 在React中实现批量删除功能通常涉及以下几个关键步骤:状态管理、用户交互处理和API调用。以下是具体实现方案: 状态管理 使用React的useState或全局状态管…

php实现多图上传

php实现多图上传

PHP 多图上传实现方法 使用 HTML 表单和 PHP 处理多文件上传需要结合前端表单设计及后端处理逻辑。以下是具体实现方式: 前端表单设计 创建包含多文件上传字段的 HTML 表单,需设置 en…