上一篇
【2025年7月最新消息】随着社交媒体和电商平台对多图上传需求的激增,最新浏览器技术已全面支持原生拖拽上传和WebP格式自动压缩,上传速度比传统方式提升40%以上,下面我们就来聊聊如何轻松实现多张图片同时上传。
现在随便发个朋友圈都得九宫格,开网店更是要一次性上传几十张产品图,传统的一张张选择、上传、等待的方式简直让人抓狂,多图上传不仅能提升用户体验,还能减少服务器请求次数,对开发者来说也是双赢。
实现多图上传的第一步是让用户能一次性选择多张图片:
<input type="file" id="imageUpload" multiple accept="image/*">
这个简单的multiple
属性就是关键,加上它用户就能在文件选择窗口按住Ctrl或Shift键多选了。accept="image/*"
则限制只能选择图片文件。
document.getElementById('imageUpload').addEventListener('change', function(e) { const files = e.target.files; if(files.length > 10) { alert('一次最多上传10张图片哦!'); return; } const formData = new FormData(); for(let i = 0; i < files.length; i++) { // 添加压缩处理(如果需要) const compressedFile = compressImage(files[i]); formData.append('images[]', compressedFile); } // 显示上传进度 const progressBar = document.getElementById('progressBar'); progressBar.style.width = '0%'; // AJAX上传 const xhr = new XMLHttpRequest(); xhr.open('POST', '/upload.php', true); xhr.upload.onprogress = function(e) { if(e.lengthComputable) { const percent = (e.loaded / e.total) * 100; progressBar.style.width = percent + '%'; } }; xhr.onload = function() { if(xhr.status === 200) { alert('上传成功!'); // 处理返回的图片URL } else { alert('上传失败,请重试'); } }; xhr.send(formData); });
function compressImage(file) { return new Promise((resolve) => { if(file.size < 1024 * 1024) { // 小于1MB不压缩 resolve(file); return; } const reader = new FileReader(); reader.onload = function(e) { const img = new Image(); img.onload = function() { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); // 按比例缩小尺寸 const MAX_WIDTH = 1600; const MAX_HEIGHT = 1600; let width = img.width; let height = img.height; if(width > MAX_WIDTH || height > MAX_HEIGHT) { const ratio = Math.min(MAX_WIDTH / width, MAX_HEIGHT / height); width *= ratio; height *= ratio; } canvas.width = width; canvas.height = height; ctx.drawImage(img, 0, 0, width, height); canvas.toBlob((blob) => { resolve(new File([blob], file.name, { type: 'image/jpeg', lastModified: Date.now() })); }, 'image/jpeg', 0.7); // 70%质量 }; img.src = e.target.result; }; reader.readAsDataURL(file); }); }
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.classList.add('highlight'); } function unhighlight() { dropArea.classList.remove('highlight'); } dropArea.addEventListener('drop', handleDrop, false); function handleDrop(e) { const dt = e.dataTransfer; const files = dt.files; // 处理上传逻辑... }
在用户选择图片后立即显示缩略图:
function createPreview(files) { const previewContainer = document.getElementById('preview'); previewContainer.innerHTML = ''; Array.from(files).forEach(file => { const reader = new FileReader(); reader.onload = function(e) { const preview = document.createElement('div'); preview.className = 'preview-item'; preview.innerHTML = ` <img src="${e.target.result}" alt="${file.name}"> <span>${file.name}</span> <button class="remove-btn" data-name="${file.name}">×</button> `; previewContainer.appendChild(preview); }; reader.readAsDataURL(file); }); }
<?php header('Content-Type: application/json'); $uploadDir = 'uploads/'; $allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; $maxSize = 5 * 1024 * 1024; // 5MB $response = []; if(!file_exists($uploadDir)) { mkdir($uploadDir, 0755, true); } foreach($_FILES['images']['tmp_name'] as $key => $tmpName) { $fileName = $_FILES['images']['name'][$key]; $fileSize = $_FILES['images']['size'][$key]; $fileType = $_FILES['images']['type'][$key]; $fileError = $_FILES['images']['error'][$key]; // 验证 if($fileError !== UPLOAD_ERR_OK) { $response[] = ['name' => $fileName, 'error' => '上传错误']; continue; } if(!in_array($fileType, $allowedTypes)) { $response[] = ['name' => $fileName, 'error' => '文件类型不支持']; continue; } if($fileSize > $maxSize) { $response[] = ['name' => $fileName, 'error' => '文件过大']; continue; } // 生成唯一文件名 $ext = pathinfo($fileName, PATHINFO_EXTENSION); $newFileName = uniqid() . '.' . $ext; $destination = $uploadDir . $newFileName; if(move_uploaded_file($tmpName, $destination)) { $response[] = [ 'name' => $fileName, 'url' => '/uploads/' . $newFileName, 'size' => $fileSize ]; } else { $response[] = ['name' => $fileName, 'error' => '保存失败']; } } echo json_encode($response); ?>
大文件上传中断怎么办?
如何限制上传数量?
if(files.length > 10) { alert('最多选择10张图片'); return; }
移动端兼容性问题
capture
属性支持相机直接拍摄上传速度慢怎么优化?
多图上传看似简单,但要做得用户体验好、性能优还是有不少门道的,本文介绍的方法已经涵盖了从基础到进阶的各种技巧,你可以根据项目需求自由组合使用,好的上传体验应该是"无感"的——用户选择图片,..就上传完了,就这么简单!
本文由 似欣嘉 于2025-07-30发表在【云服务器提供商】,文中图片由(似欣嘉)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/485284.html
发表评论