javascript拖拽上传并预览缩略图的核心是监听dragover和drop事件(需preventdefault)、用filereader读取文件生成data url预览、再通过formdata+fetch上传;全程使用原生api,无需第三方库。

JavaScript 实现拖拽文件上传并预览缩略图,核心是监听拖放事件、读取文件、生成预览图,再通过 FormData 提交。不需要第三方库,原生 API 就够用。
监听拖拽区域并阻止默认行为
给目标容器(比如一个带虚线边框的 div)绑定 dragover 和 drop 事件,关键是要在 dragover 中调用 event.preventDefault(),否则浏览器会打开文件而不是触发拖放。
- 给容器加 class 如
drop-area,设置position: relative和border: 2px dashed #999做视觉提示 -
dragover只需阻止默认行为,不处理文件 -
drop中取event.dataTransfer.files,它是一个 FileList,可遍历处理每个文件
校验文件类型和大小
用户可能拖入非图片或超大文件,提前拦截能提升体验:
- 检查
file.type.startsWith('image/'),兼容 JPG/PNG/GIF/WEBP 等 - 用
file.size 限制单图不超过 10MB - 不符合条件时给出提示(如
alert('仅支持图片,且单张不超过 10MB')),并return
生成缩略图并显示预览
用 FileReader 读取文件为 data URL,再赋值给 <img> 的 src 属性即可实时预览:
- 为每个合法文件创建
new FileReader() - 监听
reader.onload,拿到reader.result(base64 字符串) - 动态插入
<img src="..." class="preview-img">到页面,可加max-width: 200px; margin: 5px;控制样式 - 注意:
reader.readAsDataURL(file)是异步的,多个文件会并发加载,无需手动控制顺序
打包上传到服务器
预览只是前端操作,上传需用 FormData + fetch 或 XMLHttpRequest:
- 新建
const formData = new FormData() - 遍历
files,对每个file执行formData.append('images', file)(字段名按后端约定) - 调用
fetch('/upload', { method: 'POST', body: formData }),注意不要设Content-Type,让浏览器自动设置带 boundary - 可监听
fetch的.then(res => res.json())处理成功响应,比如显示“上传完成”
整个过程不依赖框架,兼容现代浏览器。缩略图预览是即时的,上传是可选动作,两者解耦清晰。如果还要支持多图排序、删除某张预览、或显示加载状态,可以在预览 <img> 外包一层容器,加按钮和状态类即可扩展。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











