批量文件按顺序上传

1,009 阅读3分钟

前端上传文件时,通常是按照用户选择文件的顺序进行上传的,但这也取决于具体的实现方式。如果你使用的是JavaScript和某些前端库或框架,你可以控制上传的顺序。

例如,如果你使用的是原生的JavaScript,你可以监听文件选择框的change事件,然后获取用户选择的文件列表(FileList对象),接着按照顺序逐个上传文件。

如果你想要实现按照用户选择的顺序异步上传文件,可以使用Promiseasync/await来控制上传顺序。下面是一个简单的示例:

document.getElementById('file-input').addEventListener('change', function(event) {
  const files = event.target.files;
  uploadFilesSequentially(files);
});

async function uploadFilesSequentially(files) {
  for (let file of files) {
    await uploadFile(file);
  }
}

function uploadFile(file) {
  return new Promise((resolve, reject) => {
    const formData = new FormData();
    formData.append('file', file);

    fetch('/upload', { // 假设你的上传API是'/upload'
      method: 'POST',
      body: formData
    })
    .then(response => response.json())
    .then(data => {
      console.log('File uploaded successfully', data);
      resolve(data);
    })
    .catch(error => {
      console.error('Error uploading file', error);
      reject(error);
    });
  });
}

在这个示例中,uploadFilesSequentially函数会按照文件在FileList中的顺序逐个上传。uploadFile函数返回一个Promise,确保每个文件上传完成后才开始下一个文件的上传。

请注意,这个示例假设你的后端接口可以处理这种上传请求,并且你的网站已经处理了必要的安全措施,比如CSRF保护。

如果使用antd的upload组件如何操作

在使用Ant Design(antd)的Upload组件时,如果你想要控制文件的上传顺序,即按照用户选择的顺序依次上传,你可以通过结合beforeUpload属性和自定义上传逻辑来实现。Ant Design的Upload组件提供了足够的灵活性来实现这种需求。

以下是一个基于antd的Upload组件实现按选择顺序上传文件的示例:

  1. 设置Upload组件的multiple属性:允许选择多个文件。
  2. 使用beforeUpload属性:拦截文件上传,将文件添加到上传队列中,但不立即上传。
  3. 自定义上传逻辑:按顺序上传队列中的文件。
import React, { useState } from 'react';
import { Upload, Button, message } from 'antd';
import { UploadOutlined } from '@ant-design/icons';

const CustomUpload = () => {
  const [fileList, setFileList] = useState([]);

  // 自定义上传逻辑
  const uploadFilesSequentially = async (files) => {
    for (let file of files) {
      // 这里是模拟的上传逻辑,实际中应替换为你的上传逻辑
      await new Promise((resolve, reject) => {
        const formData = new FormData();
        formData.append('file', file);

        // 假设上传API是'/upload'
        fetch('/upload', {
          method: 'POST',
          body: formData,
        })
          .then((response) => response.json())
          .then((data) => {
            message.success(`${file.name} 上传成功`);
            resolve(data);
          })
          .catch((error) => {
            message.error(`${file.name} 上传失败`);
            reject(error);
          });
      });
    }
    // 上传完成后清空列表
    setFileList([]);
  };

  // 处理文件选择
  const handleBeforeUpload = (file) => {
    setFileList((prevList) => [...prevList, file]);
    // 返回false以阻止自动上传
    return false;
  };

  // 处理上传操作
  const handleUpload = () => {
    uploadFilesSequentially(fileList);
  };

  return (
    <div>
      <Upload
        multiple
        fileList={fileList}
        beforeUpload={handleBeforeUpload}
        onRemove={(file) => {
          setFileList((prevList) => prevList.filter((item) => item.uid !== file.uid));
        }}
      >
        <Button icon={<UploadOutlined />}>选择文件</Button>
      </Upload>
      <Button
        style={{ marginTop: 16 }}
        type="primary"
        onClick={handleUpload}
        disabled={!fileList.length}
      >
        开始上传
      </Button>
    </div>
  );
};

export default CustomUpload;

在这个示例中,我们通过beforeUpload属性拦截了文件的自动上传,并将选中的文件保存到了状态fileList中。然后,我们提供了一个“开始上传”按钮,当点击这个按钮时,会触发uploadFilesSequentially函数,该函数按顺序异步上传fileList中的文件。上传完成后,我们清空了文件列表。

请注意,这个示例中的上传逻辑是模拟的,你需要根据实际的后端API来替换相关的上传代码。此外,确保你的后端接口可以处理这种上传请求,并且你的网站已经处理了必要的安全措施,比如CSRF保护。