XMLHttpRequest对象(2)-上传部分

一、引言

本文会详细介绍XMLHttpRequest上传部分及相关的理论知识。

不了解XMLHttpRequest对象的同学请移步XMLHttpRequest对象API部分

二、假象XMLHttpRequest对象不存在

在介绍上传这部分知识前,我思考了如何让刚接触这部分的前端人员更好地理解文件上传。

1、首先假象XMLHttpRequest对象不存在

2、我(你应该想是你)是开发浏览器文件上传接口的负责人

3、最简单的一个思路:

1)获取电脑磁盘文件的控件或接口(file表单控件)

2)上传到浏览器内存中的控件或接口(FileReader)

3)JavaScript脚本上传到服务器端的接口(XMLHttpRequest的upload属性)

1、file表单控件

1)基本属性

<input type="file" id="file" name="fileName" multiple="multiple"/>

name:控件名称

multiple:是否支持多选

注意 name一般是服务器端给定的字段

文件过滤选择框(个人感觉慎用,筛选速度特别慢,可以做上传前的文件验证)

<input type="file" accept="application/msexcel" />  
accept属性列表

1.accept="application/msexcel"

2.accept="application/msword"

3.accept="application/pdf"

4.accept="application/poscript"

5.accept="application/rtf"

6.accept="application/x-zip-compressed"

7.accept="audio/basic"

8.accept="audio/x-aiff"

9.accept="audio/x-mpeg"

10.accept="audio/x-pn/realaudio"

11.accept="audio/x-waw"

12.accept="image/gif"

13.accept="image/jpeg"

14.accept="image/tiff"

15.accept="image/x-ms-bmp"

16.accept="image/x-photo-cd"

17.accept="image/x-png"

18.accept="image/x-portablebitmap"

19.accept="image/x-portable-greymap"

20.accept="image/x-portable-pixmap"

21.accept="image/x-rgb"

22.accept="text/html"

23.accept="text/plain"

24.accept="video/quicktime"

25.accept="video/x-mpeg2"

26.accept="video/x-msvideo"

2)获取控件信息

var file = document.getElementById('file').files

file类型为数组

file[i]储存每个上传文件的一些信息,如下图:

控件信息截图

注意:经过测试上传各种类型文件,打印出来的type属性,有些文件type属性为空,所以所以想检查文件类型的话,建议取name属性 利用indexOf()检查,file控件信息只能检查文件名是否符合要求,如果想要检查文件里面的一些内容或属性,可能需要通过其他前端接口实现,下面奉上文件大小转化的一个小方法。

function readFileSize(file,retain){

     let formatSize='';

     let size = file.size/1024;

     let typeArr=["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];

      if(size<1){

          formatSize=file.size+'Byte'

        }else{

              for(let i=0;size>1;size=size/1024,i++){

                  formatSize=size.toFixed(retain)+typeArr[i]

             }

         }

     return formatSize

}

只用JavaScript初始化 file对象还有待研究,以后会深入研究,请往下看,来介绍文件上传的三大巨头之一 FileReader对象

2、FileReader

1)定义

<1>html5新增加的接口

<2>JavaScript对象

<3>将磁盘文件读取到浏览器内存中

<4>初始化 var readFile = new FileReader()


readFile对象

2)method

readFile.readAsBinaryString(file)      将文件读取为二进制编码

readFile.readAsText(file,[encoding])     将文件读取为文本 编码默认为utf-8

readFile.readAsDataURL(file)                 将文件读取为DataURL

abort                                                               中断读取操作

3)event

onabort            中断读取

onerror            读取出错

onloadstart     开始读取

onprogress      正在读取

onload               成功读取

onloadend         读取完成(无论成功还是失败)

FileReader与XMLHttpRequest有些类似,你可以把readAsBinaryString  readAsText readAsDataUrl类比成send方法,FileReader相对简单一些,没有readyState属性和open方法,两者区别是 FileReader是从本地上传文件到浏览器,XMLHttpRequest是从本地上传到服务器端,两者根本是依赖file控件对文件进行一些处理。

3、FormData

1)模拟表单控件

2)上传二进制文件

3)初始化 var formdata = new FormData(data)

data类型为dom对象 可以传递form表单 file

4)append()方法 (可以添加file对象或者blob对象)

formdata.append('name',[file或者blob对象],'fileName')

formdata.append()

FormData实例对象

4、Blob对象

1)File接口是基于Blob

2)Blob对象可以看做是存放二进制数据的容器,此外还可以通过Blob设置二进制数据的MINE类型

3)MINE类型

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开,下图附上常见的MIME类型,百度搜的,所以可能存在错误,请抱着怀疑的态度使用此图


MINE常见类型

4)初始化 var blob = new Blob(dataArr:Array<any>,opt:{type:string});

dataArr:数组,数据类型可以是任意多个ArrayBuffer,ArrayBufferView,Blob或者DOMString对象

opt:对象,用于设置Blob对象的属性(如:MIME类型)

5)blob.size 实例的长度

6)blob.slice(start,end,MIME) 

slice方法跟JavaScript很多对象(如字符串)的方法基本一样,多了第三个参数(见上文)

多说一句,利用这个方法可以做大文件分割,上传,未来的几篇中会有介绍,到时候会有连接,敬请期待。 

7)blob.close()

释放底层内存资源

8)ArrayBuffer ArrayBufferView 的介绍 有一篇文章介绍很全面了(这个部分适合单独写一篇文章)

https://www.cnblogs.com/copperhaze/p/6149041.html

5、XMLHttpRequest upload属性

1)本文的重头角色 文件上传

前面说了这么多,都是知识铺垫,文件上传,一句话:

通过FormData .append(name,data,fileName)将数据传递给后端


upload属性

2)XMLHttpRequest的upload属性,着重说一下onprogress这个事件,其他事件不明白的回到第一篇重新看。

xhr.upload.onprogress=function(event){

//上传中的一些属性,这个事件是异步的

var total = event.total;

var loaded = event.load

var progress = Number(loaded/total).toFixed(2)*100+'%'

console.log(progress)

}

3)下载进度进度事件

XMLHttpRequest.onprogress=function(event){

      // 这个后面会介绍到

}


xhr.upload.onprogress中的event参数

正所谓工欲善其事必先利其器,以上是XMLHttpRequest对象以及相关的基础知识,有些很抽象,有些介绍的也不是很全面,有些可能有还有一些问题(对于编程的学习理解:实践是检验真理的唯一途径,但不是确定真理的方法,任何通过实践掌握的真理都需要辩证地对待。),但是了解掌握了以上两篇的内容,才能更深刻的理解XMLHttpRequest对象,相对于原型,闭包,异步这些概念来说,我觉得XMLHttpRequest对象更加抽象,因为没有一定的后端基础,可能没法更好的理解它的本质,下一篇文章会结合demo着重介绍一下XMLHttpRequest的用法,会涉及到canvas、拖拽(html5的api)、vue、react、nodejs的知识。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 第二讲 什么是线性表 由同类型数据元素构成的有序序列结构。线性表可以用顺序存储结构,也可以使用链式存储结构。链式结...
    沧海梦帆阅读 305评论 0 0
  • 每年一到夏天就个声音一直让我去剪短发,昨晚听从内心的声音,去把一头长发给剪了。剪完有种一身轻松的感觉。 小屁...
    所谓荼靡阅读 308评论 2 2
  • 被你藏在唇边的语言 我就把它们写出来 漂浮的空气如五线谱 落地的花叶似音符 鸟是歌唱家 苍穹大地就是舞台 我是行走...
    龙青阅读 435评论 1 11
  • 当我们 在github上fork出一个项目后,如何保持原项目和fork之后项目的代码同步 同步原项目代码 在for...
    Sraita阅读 1,940评论 0 3