HTML怎么做文件拖放上传_html drag drop拖拽上传实现【纯干货】

梦丽君_5365

梦丽君_5365

2026-04-07

151人浏览

原创

拖放上传需先阻止浏览器默认行为:在dragover和drop事件中调用e.preventdefault(),否则drop不触发;再通过datatransfer.files获取文件,用filereader预览或校验,最后用formdata发送多文件及字段。

html怎么做文件拖放上传_html drag drop拖拽上传实现【纯干货】

怎么监听拖放事件并阻止浏览器默认行为

拖放上传第一步不是写上传逻辑,而是让浏览器别把文件当链接或图片打开——否则一拖进来就跳转或下载,根本进不到你的处理函数里。

关键在于 dragover 和 drop 两个事件必须显式调用 event.preventDefault(),否则 drop 根本不会触发。

  • dragover 事件只用于“允许放置”,不传文件,但必须阻止默认行为,否则 drop 被禁用
  • drop 事件里才能从 event.dataTransfer.files 拿到 FileList
  • 别漏掉 dragenter(可选),但 dragleave 处理起来容易误判,初学者建议先忽略
const dropArea = document.getElementById('drop-area');
dropArea.addEventListener('dragover', e => {
  e.preventDefault(); // 必须
});
dropArea.addEventListener('drop', e => {
  e.preventDefault(); // 必须
  const files = e.dataTransfer.files; // 这才是真实文件列表
  handleFiles(files);
});

如何读取文件内容并预览或校验

拿到 FileList 后不能直接发请求,得先做用户侧处理:比如图片预览、大小检查、类型过滤。这些都依赖 FileReader,但它异步,别想同步获取结果。

Article To Html
Article To Html

文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。

下载
  • 用 file.type 判断 MIME 类型(如 "image/jpeg"),但不可信——用户可改后缀,需服务端二次校验
  • 用 file.size 做前端限制,比如拒绝 >50MB 的文件,避免上传中途失败
  • 图片预览用 readAsDataURL,生成 base64 后赋值给 <img src>;大文件慎用,会吃内存
  • 文本类文件(如 .log)可用 readAsText,注意指定编码(默认 UTF-8)
function handleFiles(files) {
  Array.from(files).forEach(file => {
    if (file.size > 50 * 1024 * 1024) {
      console.warn(`${file.name} 超过 50MB,跳过`);
      return;
    }
    const reader = new FileReader();
    reader.onload = e => {
      const img = document.createElement('img');
      img.src = e.target.result;
      document.body.appendChild(img);
    };
    reader.readAsDataURL(file);
  });
}

怎么用 FormData 发送多文件且带额外字段

上传不是只扔文件,常要附带 userId、category 等字段。FormData 支持追加任意键值,但注意:同名 key 可多次 append,后端收到的就是数组(如 PHP 的 $_FILES['files'] 是多维数组,而 $_POST['tag'] 是字符串)。

  • 每个 File 对象直接传给 formData.append('files', file),不用转 blob
  • 额外字段用 formData.append('tag', 'report'),和文件一起发,无需 JSON.stringify
  • fetch 时设 Content-Type: multipart/form-data 是错的——浏览器会自动设,并带上正确的 boundary,手动设反而破坏格式
  • 如需进度条,监听 upload.onprogress(XMLHttpRequest)或用 ReadableStream(fetch 较新,兼容性差)
function uploadFiles(files) {
  const formData = new FormData();
  for (const file of files) {
    formData.append('files', file); // 注意 key 名和服务端约定一致
  }
  formData.append('projectId', '123');
  formData.append('source', 'dragdrop');
<p>fetch('/api/upload', {
method: 'POST',
body: formData // 不要设 headers.Content-Type
});
}</p>

常见报错和兼容性注意点

拖放上传在 Safari 和旧版 Edge 上容易翻车,不是代码逻辑问题,而是浏览器策略差异。

  • Failed to execute 'readAsDataURL' on 'FileReader': The requested file could not be read → 文件被其他进程占用(如 Windows 下用资源管理器正打开该文件),或路径非法(但浏览器里一般不会)
  • Safari 15.4+ 才支持 dataTransfer.items 的 getAsFile(),老版本只能靠 dataTransfer.files,别混用
  • 移动端基本不支持 drag/drop(iOS Safari 完全禁用),必须降级为点击 <input type="file">,用 click() 触发
  • 如果后端返回 400 却没提示,大概率是字段名不匹配(如前端传 files,后端收 file),先抓包确认请求体结构

最易被忽略的是:拖放区域没有设置明确宽高和 border 或 background,导致视觉上“看不见可拖区”,用户根本不知道能拖——哪怕 JS 监听正常,体验也等于零。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

html

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5915

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3332

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3010

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

3039

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4819

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2981

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2789

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2468

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2508

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 222人学习