场景引入:
你有没有遇到过这种情况?在社交媒体发九宫格照片时,选了5张图点击上传,结果页面卡死,最后只传了3张,还得重新操作😤,或者更惨——传了一半网络波动,全部前功尽弃💥,今天我们就来聊聊,现代前端如何用AJAX多图上传优雅解决这些问题!
<form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" multiple> <button>提交</button> </form>
用户选择文件 → FileList对象 → 遍历文件 → 生成FormData → 分段上传 → 服务端合并
const input = document.querySelector('input[type="file"]'); input.addEventListener('change', (e) => { const file = e.target.files[0]; const formData = new FormData(); formData.append('avatar', file); const xhr = new XMLHttpRequest(); xhr.upload.onprogress = (e) => { console.log(`进度:${Math.round((e.loaded / e.total) * 100)}%`); }; xhr.open('POST', '/upload'); xhr.send(formData); });
// 限制同时上传3个文件 const MAX_CONCURRENT = 3; let uploadingCount = 0; const queue = []; function processQueue() { while (queue.length > 0 && uploadingCount < MAX_CONCURRENT) { const { file, resolve, reject } = queue.shift(); uploadSingleFile(file).then(resolve).catch(reject); uploadingCount++; } } async function uploadAll(files) { return Promise.all( Array.from(files).map(file => { return new Promise((resolve, reject) => { queue.push({ file, resolve, reject }); processQueue(); }); }) ); }
// 生成缩略图预览 const reader = new FileReader(); reader.onload = (e) => { document.getElementById('preview').src = e.target.result; }; reader.readAsDataURL(file); // 使用canvas压缩图片 const canvas = document.createElement('canvas'); // ... 压缩逻辑
function uploadWithRetry(file, maxRetry = 3) { let attempts = 0; const attempt = () => { return uploadSingleFile(file).catch(err => { if (++attempts < maxRetry) return attempt(); throw err; }); }; return attempt(); }
:
下次当你丝滑地上传旅行照片时,别忘了背后是这些技术在保驾护航~ 🛡️ 从简单的表单到智能分片上传,前端文件处理已经进化成精密工程,试着在你下一个项目中实践这些技巧吧! 🎯
(注:本文代码示例基于2025年主流浏览器API支持情况)
本文由 六灵慧 于2025-07-30发表在【云服务器提供商】,文中图片由(六灵慧)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/485651.html
发表评论