浏览器原生实现拖拽上传:监听dragover/drop事件获取FileList,校验文件大小与类型后并发上传,通过XMLHttpRequest.upload.onprogress实时显示各文件进度,ASP后端用BinaryRead解析multipart/form-data并保存。

直接用浏览器原生能力就能做到,不需要额外框架或插件。关键在三件事:拖拽区域监听、文件批量处理、上传时实时捕获进度。
拖拽区域要能“接住”多个文件
页面上划出一块区域,比如一个带虚线边框的 div,让它能响应拖放操作。重点不是视觉效果,而是事件逻辑:
- 给目标区域绑定 dragover 事件,里面必须调用
e.preventDefault(),否则浏览器会打开文件而不是上传 - 监听 drop 事件,在里面拿到
e.dataTransfer.files—— 这是一个 FileList 对象,天然支持多文件,不用手动循环选中 - 可选但推荐:加 dragenter 和 dragleave 做视觉反馈,比如高亮边框,让用户清楚当前是否在有效区域
上传前做基础校验和分组
用户一次拖进十张图或三个压缩包很常见,别急着发请求,先筛一遍:
- 检查单个文件大小,比如限制不超过 20MB:
if (file.size > 20 * 1024 * 1024) - 按类型过滤,只允许图片上传就写
file.type.startsWith('image/') - 把通过校验的文件存进数组,后续统一处理;不通过的单独提示,比如“xxx.jpg 超过大小限制”
并发上传 + 每个文件独立进度条
别让所有文件排队传,用 Promise.all 或循环发起独立请求,每个都能显示自己的进度:
立即学习“前端免费学习笔记(深入)”;
- 对每个文件新建一个
FormData实例,formData.append('file', file) - 创建
XMLHttpRequest实例,监听xhr.upload.onprogress事件,用e.loaded / e.total算百分比 - 把进度值实时更新到对应文件的 DOM 元素上(比如一个
<div class="progress"></div>) - 成功后插入预览图(如果是图片),失败则显示错误信息并保留重试按钮
ASP 后端接收其实很简单
前端发的是标准 multipart/form-data,ASP 不需要额外组件:
- 在 save.asp 里用
Request.BinaryRead(Request.TotalBytes)接收原始数据 - 用 VBScript 解析 boundary,提取文件名、类型和二进制流
- 保存到服务器指定路径,返回 JSON 格式结果,如
{"status":"success","filename":"abc.jpg"} - 整个脚本不到 50 行,不依赖任何第三方库,IIS6 到 IIS10 都跑得动



















