上一篇
2025年7月最新动态
据行业数据显示,随着远程协作和云端办公的普及,企业日均文件传输量同比增长40%,而用户对「无刷新上传」「批量传大文件」的需求成为刚需,近期主流浏览器已全面支持新一代前端API,使得基于Ajax的多文件上传方案性能提升30%,本文将手把手教你实现这一核心功能。
想象一下这些场景:
传统表单上传的痛点很明显:页面会频繁刷新、无法实时显示进度、失败后要重头再来,而Ajax方案就像有个「隐形快递员」,能在后台安静地完成所有运输任务。
// 获取文件输入框的DOM元素 const fileInput = document.querySelector('input[type="file"]'); // 监听文件选择变化 fileInput.addEventListener('change', function() { const files = this.files; const formData = new FormData(); // 将选中的文件添加到FormData对象中 for (let i = 0; i < files.length; i++) { formData.append('files[]', files[i]); } // 创建XMLHttpRequest对象 const xhr = new XMLHttpRequest(); // 配置上传进度事件 xhr.upload.onprogress = function(e) { if (e.lengthComputable) { const percent = Math.round((e.loaded / e.total) * 100); console.log(`上传进度: ${percent}%`); } }; // 设置请求完成后的回调 xhr.onload = function() { if (xhr.status === 200) { console.log('文件上传成功!'); } else { console.error('上传出错'); } }; // 发送请求 xhr.open('POST', '/upload', true); xhr.send(formData); });
对于大文件(比如超过1GB的视频),建议采用分片上传:
async function chunkedUpload(file, chunkSize = 5 * 1024 * 1024) { const totalChunks = Math.ceil(file.size / chunkSize); for (let chunkIndex = 0; chunkIndex < totalChunks; chunkIndex++) { const start = chunkIndex * chunkSize; const end = Math.min(start + chunkSize, file.size); const chunk = file.slice(start, end); const formData = new FormData(); formData.append('file', chunk); formData.append('chunkIndex', chunkIndex); formData.append('totalChunks', totalChunks); formData.append('originalName', file.name); try { await fetch('/upload-chunk', { method: 'POST', body: formData }); console.log(`分片 ${chunkIndex + 1}/${totalChunks} 上传成功`); } catch (error) { console.error(`分片 ${chunkIndex} 上传失败:`, error); throw error; } } console.log('所有分片上传完成!'); }
// 监听拖放区域事件 dropZone.addEventListener('dragover', (e) => { e.preventDefault(); dropZone.classList.add('dragover'); // 添加视觉反馈 });
dropZone.addEventListener('drop', (e) => { e.preventDefault(); dropZone.classList.remove('dragover'); const files = e.dataTransfer.files; // 处理获取到的文件... });
2. **实时进度条**
使用CSS动画配合上传进度事件,建议采用分段式进度显示(准备中/上传中/校验中)
3. **文件预览**
通过FileReader实现图片/文档缩略图:
```javascript
function generateThumbnail(file) {
return new Promise((resolve) => {
const reader = new FileReader();
reader.onload = (e) => {
const img = new Image();
img.src = e.target.result;
img.onload = () => {
// 创建缩略图...
resolve(thumbnailUrl);
};
};
reader.readAsDataURL(file);
});
}
智能重试机制
对失败的分片自动进行3次重试,记录已成功上传的分片避免重复传输
前端文件校验
在上传前检查:
# Python示例:合并分片 def merge_chunks(file_name, total_chunks): temp_dir = f"temp_{file_name}" with open(f"uploads/{file_name}", 'wb') as final_file: for i in range(total_chunks): chunk_path = f"{temp_dir}/{i}" with open(chunk_path, 'rb') as chunk: final_file.write(chunk.read()) os.remove(chunk_path) os.rmdir(temp_dir)
对于高并发场景建议:
最新测试数据(2025年Q2)
在Chrome 118+环境下,采用优化后的分片上传方案:
掌握这些技术后,你可以轻松打造出类似WeTransfer或百度网盘的专业级上传体验,关键是根据实际场景选择合适方案——小型文件用标准FormData足够,大型重要文件则推荐分片上传+校验的稳妥方案。
本文由 东门紫薇 于2025-07-31发表在【云服务器提供商】,文中图片由(东门紫薇)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/491186.html
发表评论