当前位置:首页 > JavaScript

js实现多张

2026-03-14 06:52:30JavaScript

实现多张图片上传的JavaScript方法

使用HTML5的File API和FormData对象可以实现多张图片上传功能。以下是一个完整的实现方案:

HTML部分

创建包含文件输入框和上传按钮的HTML结构:

<input type="file" id="fileInput" multiple accept="image/*">
<button id="uploadBtn">上传图片</button>
<div id="preview"></div>

JavaScript部分

document.getElementById('uploadBtn').addEventListener('click', function() {
    const files = document.getElementById('fileInput').files;
    if (files.length === 0) {
        alert('请选择至少一张图片');
        return;
    }

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

    fetch('/upload', {
        method: 'POST',
        body: formData
    })
    .then(response => response.json())
    .then(data => {
        console.log('上传成功', data);
    })
    .catch(error => {
        console.error('上传失败', error);
    });
});

// 图片预览功能
document.getElementById('fileInput').addEventListener('change', function(e) {
    const preview = document.getElementById('preview');
    preview.innerHTML = '';

    const files = e.target.files;
    for (let i = 0; i < files.length; i++) {
        const reader = new FileReader();
        reader.onload = function(event) {
            const img = document.createElement('img');
            img.src = event.target.result;
            img.style.height = '100px';
            img.style.margin = '5px';
            preview.appendChild(img);
        };
        reader.readAsDataURL(files[i]);
    }
});

服务器端处理

Node.js Express示例:

js实现多张

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

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

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

app.listen(3000);

优化上传体验的附加功能

文件大小和类型验证

const MAX_SIZE = 5 * 1024 * 1024; // 5MB
const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/gif'];

function validateFiles(files) {
    for (let file of files) {
        if (file.size > MAX_SIZE) {
            return { valid: false, message: `${file.name}超过大小限制` };
        }
        if (!ALLOWED_TYPES.includes(file.type)) {
            return { valid: false, message: `${file.name}格式不支持` };
        }
    }
    return { valid: true };
}

进度显示

const xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', function(e) {
    const percent = Math.round((e.loaded / e.total) * 100);
    console.log(`上传进度: ${percent}%`);
}, false);

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

拖放上传实现

<div id="dropArea" style="border: 2px dashed #ccc; padding: 20px;">
    拖放图片到这里
</div>
const dropArea = document.getElementById('dropArea');

['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
    dropArea.addEventListener(eventName, preventDefaults, false);
});

function preventDefaults(e) {
    e.preventDefault();
    e.stopPropagation();
}

['dragenter', 'dragover'].forEach(eventName => {
    dropArea.addEventListener(eventName, highlight, false);
});

['dragleave', 'drop'].forEach(eventName => {
    dropArea.addEventListener(eventName, unhighlight, false);
});

function highlight() {
    dropArea.style.borderColor = 'blue';
}

function unhighlight() {
    dropArea.style.borderColor = '#ccc';
}

dropArea.addEventListener('drop', handleDrop, false);

function handleDrop(e) {
    const dt = e.dataTransfer;
    const files = dt.files;
    document.getElementById('fileInput').files = files;
    // 触发change事件
    const event = new Event('change');
    document.getElementById('fileInput').dispatchEvent(event);
}

注意事项

  • 文件上传需要服务器端配合处理
  • 大文件上传建议分片处理
  • 考虑添加CSRF保护
  • 生产环境应实现更完善的错误处理和用户反馈

以上代码提供了从客户端到服务端的完整实现方案,可以根据实际需求进行调整和扩展。

标签: 多张js
分享给朋友:

相关文章

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…