Blob、URL.createObjectURL、File、FormDate、fileReader

Blob

背景

后端返回的是JSON格式的数据,那么js可以直接处理,但是后端如果返回二进制文件流,那么js是不可以直接处理的,而Blob的存在,允许我们通过js直接操作二进制数据。

一个Blob对象就是一个包含有只读原始数据的类文件对象。Blob对象中的数据并不一定是js中的原生形式。

Blob对象和File对象都可以看做是存放二进制数据的容器,此外还可以通过Blob设置二进制数据的MIME类型。 注意:第一个参数是数组。

let blob = new Blob([ data ], {  type: 'application/xlsx' })

File

File接口基于Blob,继承了Blob的功能,并且扩展支持了用户计算机上的本地文件,因此我们可以像使用Blob一样使用File对象。

总结:Blob对象是用来接收后端接口返回的二进制文件流,File对象是用户在一个<input>元素上选择文件返回的FileList对象,File对象是特殊类型的Blob,都可以被FileReader、URL.createObjectURL()、createImageBitmap()、XMLHttpRequest.send()处理。

URL.createObjectURL

URL.createObjectURL静态方法会创建一个DOMString,其中包含一个表示参数中给出的对象URL。这个新的URL指向File对象或Blob对象。每次调用URL.createObjectURL方法时都会创建一个新的URL对象,即使你已经用相同的对象作为参数创建过。当不再需要这些URL对象时,每个对象必须通过调用URL.revokeObjectURL()方法来释放。浏览器会在文档退出的时候自动释放它们,但是为了获得最佳性能和内存使用状况,你应该在安全的时机主动释放掉它们。

FormData

背景

文件传输和普通数据传输的数据格式是不同的,也就是content-type(文档属于什么MIME类型)是不同的,普通的数据类型是application/json,告诉服务器消息主体是序列化的json字符串,直接传给后台就可以了。文件数据类型是multipart/form-data,不能直接传给服务器,需要用到FormData方法将Content-Type设置为multipart/form-data同时将File对象以健值对的方式传递给服务器,告诉服务器消息主体是表单形式的数据格式,这样子服务器就知道怎样分别解析它们。使用FormData的最大优点就是我们可以异步上传一个二进制文件。文件、语音、视频等都是二进制文件。

FileReader

背景

当后端返回的是一个图片,我需要将图片展示在页面上,因为不是json格式所以无法直接读取,这时候就需要用到FileReader方法。

FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用File或Blob对象指定要读取的文件或数据。

下面是一个读取图片的例子:

// html
 <input type="file" name="file" id="file"></br>
<input type="button" name="btn" value="读取图像" id="btn">
<div id="picBox"><img src="" width="300" height="530" id="img"/></div>
// js
 var flObj=document.getElementById("file")
var btn=document.getElementById("btn");
 btn.οnclick=function()
 {
var file=flObj.files[0]; 
flObj.files[0];    
var fReader=new FileReader();
fReader.readAsDataURL(file)
fReader.οnlοad=function(e)
 {
document.getElementById("img").src= this.result
}
}
用法
  • FileReader.readAsArrayBuffer():开始读取指定的Blob中的内容,一旦完成,result属性中保存的将是被读取文件的ArrayBuffer数据对象。

ArrayBuffer是二进制数组,这个接口的原始设计目的与WebGL有关,所谓WebGL是指浏览器与显卡之间的通信接口,为了满足js与显卡之间大量的、实时的数据交换,传统的数据格式,需要格式转化,非常耗时,这时如果数据是二进制这样子就可以原封不动地传入显卡,脚本的性能就会大幅提升,二进制数组就是在这样背景下诞生的。

  • FileReader.readAsBinaryString() :开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。
  • FileReader.readAsDataURL():开始读取指定Blob中的内容。一旦完成,rusult属性中将包含一个data:URL格式的字符串以表示所读文件的内容。一般用于读取本地图片实现预览功能,这样子就可以减少浏览器与服务器的交互。
  • FileReader.readAsText():开始读取指定的Blob中的内容。一旦完成,reuslt属性中将包含一个字符串以表示所读取的文件内容。一般用于读取类型为application/json二进制数据。

注意:图片预览功能可以通过FileReader.readAsDataURL()或window.URL.createObjectURL()来实现,如果要读取后端返回的图片、音频、视频统一用Blob()来处理,然后用window.URL.createObjectURL()这个方法生成一个url,放在src上就可以实现。

涉及知识点:下载文件(Blob)、异步上传文件(FormData)、异步读取文件(FileReader)、生成Blob对象和File对象的url(URL.createObjectURL)

参考文章:https://www.cnblogs.com/hhhyaaon/p/5929492.html

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

推荐阅读更多精彩内容