FormData、Blob、File、ArrayBuffer数据类型

摘要:
varnewFormData=newFormData;newFormData就是someFormElement这个表单元素中所有键值对数据了。AjaxsendformData的时候Content-type应该默认成multipartvarform=newFormData();form.append;varxhttp=newXMLHttpRequest();xhttp.open;xhttp.onreadystatechange=function(){if{if{console.log;}else{console.log;}}}console.log;//[ObjectFormData]//Content-type应该默认成multipart,如果不设置默认是multipart.vue-resoure插件,处理formdata:如果发生data是formData类型就直接删除了content-type//xhttp.setRequestHeader;xhttp.send;FormData对象还有一个方法,为append()方法,可以人为的给当前FormData对象添加一个键/值对。Blob对象中的数据并不一定得是JavaScript中的原生形式。

XMLHttpRequest 1.0

1.0 中xmlhttpRequest有2个重要的返回属性,reposeText,reposeXml。下面的数据类型都是2.0新增的

FormData对象

我们应该都用过jQuery,其中有个方法叫做serialize(), 作用就是表单序列化,也就是以查询字符串形式获得类表单post/get的数据给Ajax请求,例如:userid=123&username=zxx.

FormData对象的作用就类似于这里的serialize()方法,不过FormData是浏览器原生的,且支持二进制文件

实际使用是作为构造函数,如下:

new FormData ([可选]HTMLFormElement)

HTMLFormElement这个参数可选,可有可无。表示form表单元素,就是我们要序列化,要提交的那个表单元素。

var newFormData = new FormData(someFormElement);

newFormData就是someFormElement这个表单元素中所有键值对数据了。

Ajax send formData 的时候 Content-type 应该默认成multipart

<script>

    var form=newFormData();
    form.append("key","3333");
    var xhttp=newXMLHttpRequest();
    xhttp.open("POST","http://localhost:3000/",false);
    xhttp.onreadystatechange=function() {
        if(xhttp.readyState==4){
            if(xhttp.status==200){
                console.log(xhttp.responseText);
            }
            else{
                console.log(xhttp.status,xhttp.statusText);
            }
        }
    }
    console.log(form.toString()); //[Object FormData]
    //Content-type 应该默认成multipart,如果不设置默认是multipart. vue-resoure 插件,处理formdata: 如果发生data 是formData 类型就直接删除了 content-type
    //xhttp.setRequestHeader("Content-type","application/x-www-four-urlencoded");
xhttp.send(form);
    </script>

FormData对象还有一个方法,为append()方法,可以人为的给当前FormData对象添加一个键/值对。

语法如下:

voidappend(DOMString 键, Blob 值, [可选] DOMString 文件名);
void append(DOMString 键, DOMString 值);
Blob 这是用来表示二进制文件的,后面的文件名可选,据说,如果缺省,且传输的是Blob对象,则会使用"blob"代替。

Blob数据对象

一个Blob对象就是一个包含有只读原始数据的类文件对象。Blob对象中的数据并不一定得是JavaScript中的原生形式。File接口基于Blob, 继承了Blob的功能,并且扩展支持了用户计算机上的本地文件。

创建Blob对象的方法有几种,可以调用Blob构造函数,还可以使用一个已有Blob对象上的slice()方法切出另一个Blob对象,还可以调用canvas对象上的toBlob方法。

举个例子,使用Blob从服务器上GET某个图片:

var xhr = newXMLHttpRequest();    
xhr.open("get", "mm1.jpg", true);
xhr.responseType = "blob";
xhr.onload = function() {
    if (this.status == 200) {
        var blob = this.response;  //this.response也就是请求的返回就是Blob对象
        var img = document.createElement("img");
        img.onload = function(e) {
          window.URL.revokeObjectURL(img.src); //清除释放
};
        img.src =window.URL.createObjectURL(blob);
        eleAppend.appendChild(img);    
    }
}
xhr.send();

Blob对象有两个属性:

1.size:Blob对象中所包含数据的大小。字节为单位。只读。

2.一个字符串,表明该Blob对象所包含数据的MIME类型。例如,上demo图片MIME类似就是”image/jpeg“. 如果类型未知,则该值为空字符串。只读。

构造函数

Blob也有一个构造函数用法。语法如下:

Blob Blob(
  [可选] Array parts,
  [可选] BlobPropertyBag properties
);

其中,两个参数的含义是:

parts
一个数组,包含了将要添加到Blob对象中的数据。数组元素可以是任意多个的ArrayBuffer, ArrayBufferView(typed array), Blob, 或者DOMString对象。
properties
一个对象,设置Blob对象的一些属性。目前仅支持一个type属性,表示Blob的类型

方法

Blob对象有个很重要的方法-slice(),作用是,可以实现文件的分割

Blob slice(
  [可选] long longstart,
  [可选] long longend,
  [可选] DOMString contentType
};

start开始索引,可以为负数,语法类似于数组的slice方法。默认值为0.end结束索引,可以为负数,语法类似于数组的slice方法。默认值为最后一个索引。contentType新的Blob对象的MIME类型,这个值将会成为新的Blob对象的type属性的值,默认为一个空字符串。

显然,此方法返回的数据格式还是Blob对象,不过是指定范围复制的新的Blob对象。注意,如果start参数的值比源Blob对象的size属性值还大,则返回的Blob对象的size值为0,也就是不包含任何数据。

File对象

表示我们使用file控件(<input type="file">)选择的对象,或者是使用拖拽操作搞出的DataTransfer对象。

这里的File对象也是二进制对象,因此,从属于Blob对象,Blob对象的一些属性与方法,File对象同样适合,且推荐使用Blob对象的属性与方法。

属性

File.lastModifiedDate[只读]
文件对象最后修改的日期
File.name[只读]
文件对象的名称

Blob.size[只读]

Blob对象包含数据的字节大小

Blob.type[只读]

一个字符串,表明该Blob对象所包含数据的MIME类型

<script>
 functionchange(file){
     console.dir(file.files[0]);
 }
</script>

<body>
    <input type="file" onchange="change(this)">
</body>

FormData、Blob、File、ArrayBuffer数据类型第1张

ArrayBuffer对象

ArrayBuffer表示二进制数据的原始缓冲区,该缓冲区用于存储各种类型化数组的数据。

ArrayBuffer是二进制数据通用的固定长度容器。

Blob可以appendArrayBuffer数据,也就是Blob是个更高一级的大分类,类似领导的感觉。ArrayBuffer则是具有某种恶魔果实的尖兵。

下一文章说一下,类型数组typedArray

免责声明:文章转载自《FormData、Blob、File、ArrayBuffer数据类型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇svn的应用Single Sign On下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HTML5 文件处理之FileAPI简介整理

  在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅长的处理之一。但文件处理,尤其是二进制文件处理,一直是个空白。在一些情况下,我们不得不通过Flash/ActiveX/NP插件或云端的服务器处理较为复杂或底层的数据。今天,HTML5的一系列新规范正在致力于让浏览器具备更强大的文件处理能力。 今天要介绍...

python读取二进制文件写入到txt

import os os.chdir(r'C:UsersUsmartDesktopfile_test') fp=open("index.dat",'rb') #以只读二进制文件打开 data = fp.read() fp_txt=open("text.txt",'w') #以只读二进制文件打开 for tmp in data: writedata...

php如何将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串!编辑

php如何将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串!经过查找居然如此简单,一个函数就搞定了。 数据库脚本: -- -------------------------------------------------------- -- -- 表的结构 `highot_attachment` -- CREATE T...

关于文件中的0D、0A

文件一般分为文本文件和二进制文件。   在windows文本文件中,分行即‘ “,表示为0x0D 0x0A。分为两种情况:  如果你想一个文本文件中写入一个' ',文本文件中会增加0x0D 0x0A两个字节(可以使用utraledit来查看,记事本是看不出来的); 如果你读一个文本文件,一旦遇到0x0D 0x0A,遍会读为一个' '(0x0A)。   ...

JavaScript 如何压缩目录并上传?

在日常工作中,文件上传是一个很常见的功能。在上传文件时,我们可以选择上传单个文件,也可以通过设置multiple属性来上传多个文件。 本文阿宝哥将介绍如何上传目录及如何压缩目录并上传,压缩目录的功能是通过 JSZip 这个库来实现。利用这个库还可以实现在线预览 ZIP 文件的功能,感兴趣的小伙伴可以阅读 JavaScript 如何在线解压 ZIP 文件?这...

位运算符、按位与、按位或、按位非、左移、右移、原码、反码、补码

位运算符的基本规则1,位运算符都是针对整数的二进制数字形式而进行的。2,按位与运算基本规则(规则表):1 & 1 ==> 11 & 0 ==> 00 & 1 ==> 00 & 0 ==> 0;3, 按位或运算基本规则1 | 1 ==> 1;1 | 0 ==> 1;0 | 1 ==>...