Vue中使用HTML5拖拽API实现文件上传,需监听dragover、drop等事件并阻止默认行为,从dataTransfer.files提取文件,结合FormData与Axios上传,同时提供点击选择的降级方案。

Vue 中使用 HTML5 拖拽 API 实现文件上传,核心是监听 dragover、drop 等原生事件,并阻止默认行为,再从 event.dataTransfer.files 中提取文件对象。它不依赖第三方库,轻量且兼容性好(IE10+)。
基础拖拽区域搭建
先创建一个可拖入文件的容器,绑定关键事件:
- dragover:必须阻止默认行为,否则浏览器会打开文件或导航离开页面
- drop:获取拖入的文件列表,进行后续处理(如上传)
- dragenter / dragleave(可选):用于视觉反馈,比如高亮区域
示例模板:
@drop.prevent="handleDrop"
@dragenter.prevent="isDragging = true"
@dragleave.prevent="isDragging = false"
:class="{ 'drag-active': isDragging }"
>
拖拽文件到这里上传
在 Vue 组件中处理拖拽逻辑
在 setup 或 methods 中定义响应函数。注意:dataTransfer.files 是 FileList,需转为数组才能用 map 或 forEach:
-
handleDragOver只需event.preventDefault(),保持拖拽状态持续有效 -
handleDrop中检查event.dataTransfer.files.length,过滤掉非文件项(如拖入的网页链接) - 推荐对每个
File对象做基础校验:类型、大小(例如限制
简单实现示例(Composition API):
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
const handleDrop = (e) => {
const files = Array.from(e.dataTransfer.files)
if (files.length === 0) return
files.forEach(file => {
if (file.type.startsWith('image/')) {
uploadFile(file) // 自定义上传函数
}
})
}
结合上传逻辑(如 Axios)
拿到 File 后,通常用 FormData 构造请求体:
- 新建
FormData实例,.append('file', file) - 若需多文件,可循环追加,或使用唯一 key 如
file[0]、file[1] - 调用
axios.post时,不能设置Content-Type,让浏览器自动设置带 boundary 的 multipart/form-data - 可监听
onUploadProgress实现上传进度条
示例上传函数:
const uploadFile = async (file) => {const formData = new FormData()
formData.append('file', file)
try {
await axios.post('/api/upload', formData, {
headers: { 'X-Requested-With': 'XMLHttpRequest' },
onUploadProgress: e => {
console.log(`上传进度:${Math.round((e.loaded / e.total) * 100)}%`)
}
})
} catch (err) {
console.error('上传失败', err)
}
}
补充:支持点击选择文件(降级方案)
拖拽不是所有用户都习惯,建议同时提供「点击上传」入口,复用同一套上传逻辑:
- 隐藏原生
,用按钮触发click() - 监听
input事件,获取$event.target.files,与drop中逻辑一致 - 可统一用
processFiles(files)函数封装校验和上传流程
这样既满足无障碍访问,也覆盖移动端(部分 iOS 浏览器对拖拽支持有限)。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










