文件上传

文件上传原理

文件上传的原理,就是DOM中的FileUpload对象。就是这句

<input type="file">

但仅仅这样并不足够。

文件上传本质上是需要按照特定的HTTP请求格式来处理文件,也就是在表单中将enctype="multipart/form-data"来实现。

multipart互联网上的混合资源,就是资源由多种元素组成,form-data表示可以使用HTML Forms 和 POST 方法上传文件,具体的定义可以参考RFC 7578。

当我们设置该属性后,请求体也发生了变化。

能够看到使用multipart/form-data上传文件中将会采用boundary来进行文件的分块处理。

同步的文件上传

如下写法在IE时代将会是首选,采用form表单的同步上传功能实现文件的上传。

<form action="http://localhost:8100" method="POST" enctype="multipart/form-data"><input type="file" name="f1" id="f1"><input type="submit" id="bth">
</form>

我们用这个例子来理解下<input tyep="file">。我们将该元素打印出来。

let f1 = document.getElementById("f1")
console.log(f1.files)

如图所示,能够以数组的形式看到我们所选中的文件内容。

但这只是单文件的上传,对于多文件只需在标签中添加一个multiple即可。

<form action="http://127.0.0.1:1337" method="POST" enctype="multipart/form-data"><input type="file" name="f1" id="f1" multiple><input type="submit" id="bth"></form>
</body>
<script>let f1 = document.getElementById("f1")console.log(f1.files)
</script>

异步的文件上传

上述只是文件的同步上传,但现在我们大多采取XMLHttprequest来进行异步的文件上传。

使用XMLHttprequest2进行文件上传在此简要介绍XMLHttpRequest所达到的好处。

  • 引入fileData类型来管理表单上传。
  • 新增xhr.upload.onprogress进行回调来实现上传进度的监听。
  • 可设置ontimeout来防止超时。
  • 依旧收同源策略影响,但可以在后端配置CORS来实现跨域。
<body><input type="file" name="f1" id="f1" multiple><button id="btn">上传</button>
</body>
<script>let btn = document.getElementById("btn")function upLoad() {let files = document.getElementById("f1").fileslet fileData = new FormData()let xhr = new XMLHttpRequest()for (let i = 0; i < files.length; i++) {fileData.append("files", files[i])}xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {//上传成功}}}xhr.open("POST", "http://127.0.0.1:1337", true)xhr.send(fileData)}btn.addEventListener("click", function () {upLoad()console.log("发起上传")}, false)
</script>

文件上传的进度

为了监控文件上传的进入,也就需要调用xhr.onload.onprogress方法进行上传百分比的计算。

xhr.upload.onprogress = function (e) {if(e.lengthComputable) {var percentComplete = (e.loaded / e.total) * 100;// 对进度进行处理}}

文件上传的拖拽

大体思路就是对拖拽的三个事件dragenter,dragover,drop进行监听,阻拦浏览器默认的拖拽打开事件,并阻止冒泡。最后获取到拖拽的文件。

<div id="dragBox" style="width: 300px;height: 300px; background-color: blanchedalmond;"></div>
let dragBox = document.getElementById("dragBox")dragBox.addEventListener("dragenter", handleDragenter, false)dragBox.addEventListener("dragover", handleDragover, false)dragBox.addEventListener("drop", handleDrop, false)
function handleDragenter(e) {// 阻止浏览器默认拖拽进入事件、并防止冒泡e.stopPropagation()e.preventDefault()}function handleDragover(e) {// 阻止浏览器默认拖拽覆盖事件、并阻止冒泡e.stopPropagation()e.preventDefault()}function handleDrop(e) {// 阻止浏览器默认放下事件、并阻止冒泡e.stopPropagation()e.preventDefault()// 获取拖拽的文件let files = e.dataTransfer.files}

文件上传的预览

关于文件上传后的预览方式有很多,可以前后端联合,前端上传结束后再从后端获取图片。

也可以利用H5新增的FileReader来进行文件的读取。

<input type="file" name="f1" id="f1" multiple><div id="preview"></div><script>document.getElementById("f1").addEventListener("change", function () {let preview = document.getElementById("preview")let img = document.createElement("img")let fileInput = document.getElementById("f1")let file = fileInput.files[0]img.width = 100img.height = 100preview.appendChild(img)// 使用H5的FileReader对象let reader = new FileReader()// 开始读取指定Blog中的内容reader.readAsDataURL(file)reader.onload = (e) => {img.src = e.target.result}}, false)
</script>

猛虎分享

一起进步

共勉

有需要的小伙伴可以关注微信公众号趣玩前端每日分享前端技术知识点。可进微信群和我们一起学习,一起探讨,还可以领取最新的前端学习资源。

2020前端最新学习资源(一)​mp.weixin.qq.com

ajaxfileupload 监听上传进度_一篇文章学会文件上传相关推荐

  1. django文件——django + jquery-file-upload上传篇(二)-- 插件实现文件上传+进度条显示 +拖入文件上传...

    django + jquery-file-upload 插件实现文件上传+进度条显示 1.model.py class Fujian(models.Model):name = models.CharF ...

  2. php 上传乱码_如何解决php文件上传中文乱码问题

    php文件上传中文乱码的解决办法:首先打开相应的PHP文件:然后通过"iconv("UTF-8", "gbk",$name)"方法对文件名进 ...

  3. maven 文件上传下载_使用Maven将文件上传和下载到S3

    maven 文件上传下载 多年来,我已经看到许多团队以许多不同的方式使用Maven. Maven可用于许多ci / cd任务,而无需使用额外的管道代码,或者可用于在运行某些测试之前准备开发环境. 通常 ...

  4. 利用python从网络上爬取图片_一篇文章教会你利用Python网络爬虫抓取王者荣耀图片...

    点击上方"IT共享之家",进行关注 回复"资料"可获赠Python学习福利 [一.项目背景] 王者荣耀作为当下最火的游戏之一,里面的人物信息更是惟妙惟肖,但受到 ...

  5. 括号表示法字符串构造二叉树_一篇文章学会二叉树和二叉查找树

    树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分层的方式存储数据. 树被用来存储具有层级关系的数据,比如文件系统中的文件. 树还可以用来存储有序列表. 树的定义 树是由一组以边连 ...

  6. java 最少使用(lru)置换算法_一篇文章学会如何基于LRU-K算法设计本地缓存实现流量削峰...

    专注于Java领域优质技术号,欢迎关注 作者:一个Java菜鸟 1.背景介绍 1.1.现象 QPS突然增长2倍以上(45w~60w每分钟) 将产生下面一些问题: 1)响应接口响应时长增加了5倍(qps ...

  7. springboot 上传文件_基于SpringBoot的文件上传

    在实际的企业开发中,文件上传是最常见的功能之一,SpringBoot集成了SpringMVC常用的功能,当然也包含了文 件上传的功能,实现起来没有太多的区别. 下面我们来讲解一下,使用SpringBo ...

  8. 简单的html网页图片上传,10个有用的HTML文件上传技巧

    上传文件的能力是许多Web和移动应用的关键需求,从将照片上传到社交媒体上到将简历发布到工作门户网站上,文件上传无处不在. 作为一名Web开发人员,我们一定知道HTML提供了原生文件上传的支持,并借助于 ...

  9. 上传问题总结(文件大小检测,大文件上传)

    PHP上传问题总结(文件大小检测,大文件上传) 由于涉及到本地和服务器两方面的安全问题,所以基于input type="file"形式的页面文件上传一直处于一个很尴尬的位置.一方面 ...

最新文章

  1. android系统短信库的一些用法
  2. ALSA声卡笔记3--ASoC驱动重要结构体关系图
  3. Android实例-MotionSensor加速度(XE8+小米2)
  4. Codeforces Round #304 C(Div. 2)(模拟)
  5. 【收藏】机器学习入门的常见问题集(文末送书)
  6. About Gnu Linker2
  7. ng-template 使用过程中默认参数不能按照期望工作的问题单步调试
  8. Linux内存管理详解
  9. 【转】医疗业务学习笔记--DICOM协议的基础内容!!!!!!!!!!
  10. 【LeetCode笔记】338. 比特位计数(Java、位运算、动态规划)
  11. Mysql的执行顺序与优化分析
  12. 棋盘问题(信息学奥赛一本通-T1217)
  13. SQL 一次插入多条记录
  14. web安全day29:linux日志异地备份
  15. NumPy常用中文手册
  16. 交互设计沉思录:顶尖设计专家Jon Kolko的经验与心得(原书第2版)
  17. 12升19V 24V 36V 100V大功率升压电源DC-DC 大功率升压方案
  18. 网站建设|网站导航设计超强方法总结
  19. softmax函数名字的由来(代数几何原理)——softmax前世今生系列(2)
  20. 还在寻找一款DVD全能转换器吗?WinX DVD Ripper for Mac它不香吗?

热门文章

  1. 喵哈哈村小学上课啦(欧拉函数)
  2. [debug] 延长Linux中sudo密码在终端的有效时间
  3. [Python] 将两个列表合并为字典
  4. OPNET网络仿真分析-目 录
  5. aiohttp/flask python后端单元测试,单元测试覆盖率测试
  6. clickhouse 部署+介绍
  7. jpg/png格式图片转eps格式
  8. EAST: An Efficient and Accurate Scene Text Detector
  9. Python中self的用法详解(链接传送)
  10. basys3芯片型号xc7a35tcpg236-1