当前位置:首页 > JavaScript

js实现批量上传

2026-01-30 10:26:10JavaScript

js实现批量上传的方法

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

基本实现步骤

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

<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发送请求:

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);

分片上传方案

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

js实现批量上传

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 拖拽上传实现方法 使用 HTML5 原生拖拽 API 在 Vue 中可以通过监听原生拖拽事件实现基础功能: <template> <div class="dr…

vue实现批量上传

vue实现批量上传

Vue 实现批量上传的方法 使用 <input type="file"> 和 multiple 属性 在 Vue 模板中添加一个文件输入框,设置 multiple 属性以允许选择多个文件。…

vue 实现批量导入

vue 实现批量导入

实现批量导入的基本思路 在Vue中实现批量导入功能通常需要结合前端文件上传和后端数据处理。前端负责收集用户上传的文件,后端负责解析文件内容并处理数据。 前端文件上传组件 使用Vue的文件上传组件可以…

vue实现图片重新上传

vue实现图片重新上传

实现图片重新上传功能 在Vue中实现图片重新上传功能,通常涉及文件选择、预览、上传和重置等步骤。以下是一个完整的实现方案: 模板部分 <template> <div>…

前端vue实现批量移动

前端vue实现批量移动

实现思路 在Vue中实现批量移动功能通常涉及选择多个项目并移动到目标位置。核心逻辑包括选择项管理、目标位置确认和移动操作执行。 数据准备 需要准备两个数组:源数据列表和目标数据列表。同时维护一个选中…

vue实现上传预览功能

vue实现上传预览功能

Vue实现上传预览功能 基本文件上传组件 使用<input type="file">获取文件,通过FileReader读取文件内容: <template> <div…