当前位置:首页 > JavaScript

js实现多文件自动上传

2026-04-05 03:28:05JavaScript

实现多文件自动上传的 JavaScript 方法

使用 HTML5 的 File APIFormData 对象可以实现多文件自动上传。以下是一个完整的实现方案。

HTML 部分

创建一个文件选择输入框和一个上传按钮:

js实现多文件自动上传

<input type="file" id="fileInput" multiple>
<button id="uploadButton">上传文件</button>
<div id="progressContainer"></div>

JavaScript 部分

监听文件选择并实现自动上传逻辑:

js实现多文件自动上传

document.getElementById('uploadButton').addEventListener('click', function() {
    const fileInput = document.getElementById('fileInput');
    const files = fileInput.files;

    if (files.length === 0) {
        alert('请选择至少一个文件');
        return;
    }

    uploadFiles(files);
});

function uploadFiles(files) {
    const formData = new FormData();

    for (let i = 0; i < files.length; i++) {
        formData.append('files[]', files[i]);
    }

    const xhr = new XMLHttpRequest();

    xhr.open('POST', '/upload', true);

    xhr.upload.onprogress = function(e) {
        if (e.lengthComputable) {
            const percentComplete = Math.round((e.loaded / e.total) * 100);
            document.getElementById('progressContainer').innerHTML = 
                `上传进度: ${percentComplete}%`;
        }
    };

    xhr.onload = function() {
        if (xhr.status === 200) {
            alert('文件上传成功');
        } else {
            alert('文件上传失败');
        }
    };

    xhr.send(formData);
}

使用 Fetch API 的现代实现

async function uploadFiles(files) {
    const formData = new FormData();

    for (let i = 0; i < files.length; i++) {
        formData.append('files[]', files[i]);
    }

    try {
        const response = await fetch('/upload', {
            method: 'POST',
            body: formData
        });

        if (response.ok) {
            const result = await response.json();
            console.log('上传成功', result);
        } else {
            throw new Error('上传失败');
        }
    } catch (error) {
        console.error('上传错误:', error);
    }
}

拖放上传实现

const dropArea = document.getElementById('dropArea');

dropArea.addEventListener('dragover', (e) => {
    e.preventDefault();
    dropArea.classList.add('dragover');
});

dropArea.addEventListener('dragleave', () => {
    dropArea.classList.remove('dragover');
});

dropArea.addEventListener('drop', (e) => {
    e.preventDefault();
    dropArea.classList.remove('dragover');
    const files = e.dataTransfer.files;
    uploadFiles(files);
});

服务器端处理示例 (Node.js Express)

const express = require('express');
const multer = require('multer');
const app = express();

const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.array('files[]'), (req, res) => {
    res.json({ message: '文件上传成功', files: req.files });
});

app.listen(3000, () => console.log('服务器运行中'));

进度条改进

使用更详细的进度显示:

function createProgressBar(fileName) {
    const container = document.getElementById('progressContainer');
    const progressDiv = document.createElement('div');
    progressDiv.innerHTML = `
        <p>${fileName}</p>
        <progress value="0" max="100"></progress>
        <span class="percent">0%</span>
    `;
    container.appendChild(progressDiv);
    return progressDiv.querySelector('progress');
}

并发上传控制

限制同时上传的文件数量:

async function uploadWithConcurrency(files, maxConcurrent = 3) {
    const queue = [...files];
    const inProgress = new Set();
    const results = [];

    while (queue.length > 0 || inProgress.size > 0) {
        while (inProgress.size < maxConcurrent && queue.length > 0) {
            const file = queue.shift();
            const promise = uploadFile(file)
                .then(result => {
                    inProgress.delete(promise);
                    results.push(result);
                });
            inProgress.add(promise);
        }
        await Promise.race([...inProgress]);
    }

    return results;
}

这些方法提供了从基础到高级的多文件上传实现方案,可以根据具体需求选择合适的实现方式。

标签: 上传文件
分享给朋友:

相关文章

vue实现文件预览展示

vue实现文件预览展示

Vue 实现文件预览展示的方法 使用第三方库预览常见文件类型 对于常见的文件类型(如 PDF、图片、视频等),可以使用现成的 Vue 组件库来实现预览功能。 PDF 预览:使用 vue-pdf 或…

vue 实现上传

vue 实现上传

Vue 实现文件上传的方法 在 Vue 中实现文件上传可以通过多种方式完成,以下是几种常见的方法: 使用原生 HTML 的 input 元素 通过 HTML 的 input 元素设置 type="f…

vue实现上传进度

vue实现上传进度

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

vue实现搜索文件

vue实现搜索文件

Vue 实现搜索文件功能 在 Vue 中实现文件搜索功能,可以通过以下步骤完成。这里假设文件数据存储在本地或通过 API 获取。 数据准备 确保有一个文件列表数据,可以是静态数据或从后端 API 获…

vue用户实现头像上传

vue用户实现头像上传

前端实现头像上传(Vue + Element UI) 环境准备 确保项目已安装element-ui和axios(或其他HTTP库): npm install element-ui axios 组件代…

vue实现拖动文件移动

vue实现拖动文件移动

Vue 实现文件拖动移动 实现文件拖动移动功能通常涉及 HTML5 的拖放 API 和 Vue 的事件处理。以下是具体实现方法: 基础拖放实现 在 Vue 组件中设置拖放区域并处理相关事件:…