当前位置:首页 > 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 实现文件上传 使用 Vue 实现文件上传可以通过原生 HTML 的 <input type="file"> 或第三方库(如 axios、vue-upload-component)完…

vue实现文件预览展示

vue实现文件预览展示

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

java如何读取文件

java如何读取文件

读取文件的常用方法 Java提供了多种读取文件的方式,适用于不同场景和需求。以下是几种常见的方法: 使用FileInputStream和BufferedInputStream读取二进制文件…

vue实现文件功能

vue实现文件功能

Vue 实现文件上传功能 使用 Vue 实现文件上传功能可以通过原生 HTML 的 <input type="file"> 结合 Vue 的事件处理和 HTTP 请求库(如 Axios)来…

vue 实现文件下载

vue 实现文件下载

使用 window.open 方法 通过 window.open 直接打开文件链接触发下载,适用于已知文件 URL 的情况: window.open('文件URL', '_blank') 使用 &l…

vue实现文件进度

vue实现文件进度

Vue 实现文件上传进度 使用 Vue 实现文件上传进度可以通过结合 axios 或原生 XMLHttpRequest 的进度事件来实现。以下是两种常见方法: 使用 axios 上传文件并显示进度…