http://www.cnblogs.com/jscode/archive/2013/04/27/3572239.html

历史上,JavaScript无法处理二进制数据。如果一定要处理的话,只能使用charCodeAt()方法,一个个字节地从文字编码转成二进制数据,还有一种办法是将二进制数据转成Base64编码,再进行处理。这两种方法不仅速度慢,而且容易出错。ECMAScript5引入了Blob对象,允许直接操作二进制数据。

Bolb对象是一个代表二进制数据的基本对象,在它的基础上,又衍生出一系列相关的API,用来操作文件。

File对象:负责处理那些以文件形式存在的二进制数据,也就是操作本地文件

FileList对象:File对象的网页表单接口

FileReader对象:负责将二进制数据读入内存

URL对象:用于对二进制数据生成URL

1、Blob对象

Blob(Binary Large Object)对象代表了一段二进制数据,提供了一系列操作接口。其他操作二进制数据的API(比如File对象),都是建立在Blob对象基础上的,继承了它的属性和方法。

生成Blob对象有两种方法:一种是使用Blob构造函数,另一种是对现有的Blob对象使用slice方法切出一部分。

(1)Blob构造函数,接受两个参数。第一个参数是一个包含实际数据的数组,第二个参数是数据的类型,这两个参数都不是必需的。

var htmlParts = ['hey!'];

var myBlob = new Blob(htmlParts, {'type': 'text\/xml'});

下面是一个利用Blob对象,生成可下载文件的例子。

var blob = new Blob(['Hello World']);

var a = document.createElement('a');

a.href = window.URL.createObjectURL(blob);

a.donwload = 'hello-world.txt';

a.textContent = 'Download Hello World';

body.appendChild(a);

上面的代码生成了一个超级链接,点击后提示下载文本文件hello-world.txt,文件内容为"Hello World"。

(2) Blob对象的slice方法,将二进制数据按照字节分块,返回一个新的Blob对象。

var newBlob = oldBlob.slice(startingByte, endindByte);

下面是一个使用XMLHttpRequest对象,将大文件分割上传的例子。

function upload(blobOrFile) {

var xhr = new XMLHttpRequest();

xhr.open('POST', '/server', true);

xhr.onload = function(e) { ... };

xhr.send(blobOrFile);

}

document.querySelector('input[type="file"]').addEventListener('change', function(e) {

var blob = this.files[0];

var BYTES_PER_CHUNK = 1024 * 1024; // 1MB chunk sizes.

var SIZE = blob.size;

var start = 0;

var end = BYTES_PER_CHUNK;

while(start < SIZE) {

upload(blob.slice(start, end));

start = end;

end = start + BYTES_PER_CHUNK;

}

}, false);

(3)Blob对象有两个只读属性:

size:二进制数据的大小,单位为字节。

type:二进制数据的MIME类型,全部为小写,如果类型未知,则该值为空字符串。

在Ajax操作中,如果xhr.responseType设为blob,接收的就是二进制数据。

2、FileList对象

FileList对象针对表单的File控件。当用户通过file控件选取文件后,这个控件的files属性值就是FileList对象。它在结构上类似于数组,包含用户选取的多个文件。

当用户选取文件后,就可以读取该文件。

var selected_file = document.getElementById('input').files[0];

采用拖放方式,也可以得到FileList对象。

var dropZone = document.getElementById('drop_zone');

dropZone.addEventListener('drop', handleFileSelect, false);

function handleFileSelect(evt) {

evt.stopPropagation();

evt.preventDefault();

var files = evt.dataTransfer.files; // FileList object.

// ...

}

上面代码的 handleFileSelect 是拖放事件的回调函数,它的参数evt是一个事件对象,该参数的dataTransfer.files属性就是一个FileList对象,里面包含了拖放的文件。

3、File对象

File对象是FileList对象的成员,包含了文件的一些元信息,比如文件名、上次改动时间、文件大小和文件类型。它的属性值如下:

name:文件名,该属性只读

size:文件大小,单位为字节,该属性只读

type:文件的MIME类型,如果分辨不出类型,则为空字符串,该属性只读。

lastModifiedDate:文件的上次修改时间,该属性只读。

var selected_file = document.getElementById('input').files[0];

var fileName = selected_file.name;

var fileSize = selected_file.size;

var fileType = selected_file.type;

4、FileReader 对象

FileReader对象接收File对象或Blob对象作为参数,用于读取文件的实际内容,即把文件内容读入内存。对于不同类型的文件,FileReader使用不同的方法读取。

FileReader.readAsBinaryString(Blob|File) :读取结果为二进制字符串,每个字节包含一个0到255之间的整数。

FileReader.readAsText(Blob|File, opt_encoding) :读取结果是一个文本字符串。默认情况下,文本编码格式是'UTF-8',可以通过可选的格式参数,指定其他编码格式的文本。

FileReader.readAsDataURL(Blob|File) : 读取结果是一个基于Base64编码的 data-uri 对象。

FileReader.readAsArrayBuffer(Blob|File) :读取结果是一个 ArrayBuffer 对象。

FileReader采用异步方式读取文件,可以为一系列事件指定回调函数。

onabort:读取中断或调用reader.abort()方法时触发。

onerror:读取出错时触发。

onload:读取成功后触发。

onloadend:读取完成后触发,不管是否成功。触发顺序排在 onload 或 onerror 后面。

onloadstart:读取将要开始时触发。

onprogress:读取过程中周期性触发。

下面的代码是如何展示文本文件的内容。

var reader = new FileReader();

reader.onload = function(e){

console.log(e.target.result);

}

reader.readAsText(blob);

onload事件的回调函数接受一个事件对象,该对象的target.result就是文件的内容。

下面是一个使用readAsDataURL方法,为img元素添加src属性的例子。

var reader = new FileReader();

reader.onload = function(e) {

document.createElement('img').src = e.target.result;

};

reader.readAsDataURL(f);

下面是一个onerror事件回调函数的例子。

var reader = new FileReader();

reader.onerror = errorHandler;

function errorHandler(evt) {

switch(evt.target.error.code) {

case evt.target.error.NOT_FOUND_ERR:

alert('File Not Found!');

break;

case evt.target.error.NOT_READABLE_ERR:

alert('File is not readable');

break;

case evt.target.error.ABORT_ERR:

break;

default:

alert('An error occurred reading this file.');

};

}

下面是一个onprogress事件回调函数的例子,主要用来显示读取进度。

var reader = new FileReader();

reader.onprogress = updateProgress;

function updateProgress(evt) {

if (evt.lengthComputable) {

var percentLoaded = Math.round((evt.loaded / evt.totalEric Bidelman) * 100);

var progress = document.querySelector('.percent');

if (percentLoaded < 100) {

progress.style.width = percentLoaded + '%';

progress.textContent = percentLoaded + '%';

}

}

}

读取大文件的时候,可以利用Blob对象的slice方法,将大文件分成小段,逐一读取,这样可以加快处理速度。

5、URL对象

URL对象用于生成指向File对象或Blob对象的URL。

var objecturl = window.URL.createObjectURL(blob);

上面的代码会对二进制数据生成一个URL,类似于“blob:http%3A//test.com/666e6730-f45c-47c1-8012-ccc706f17191”。这个URL可以放置于任何通常可以放置URL的地方,比如img标签的src属性。需要注意的是,即使是同样的二进制数据,每调用一次URL.createObjectURL方法,就会得到一个不一样的URL。

这个URL的存在时间,等同于网页的存在时间,一旦网页刷新或卸载,这个URL就失效。除此之外,也可以手动调用URL.revokeObjectURL方法,使URL失效。

window.URL.revokeObjectURL(objectURL);

下面是一个利用URL对象,在网页插入图片的例子。

var img = document.createElement("img");

img.src = window.URL.createObjectURL(files[0]);

img.height = 60;

img.onload = function(e) {

window.URL.revokeObjectURL(this.src);

}

body.appendChild(img);

var info = document.createElement("span");

info.innerHTML = files[i].name + ": " + files[i].size + " bytes";

body.appendChild(info);

还有一个本机视频预览的例子。

var video = document.getElementById('video');

var obj_url = window.URL.createObjectURL(blob);

video.src = obj_url;

video.play()

window.URL.revokeObjectURL(obj_url);

6、参考链接

h5如何上传文件二进制流_HTML5新特性之文件和二进制数据的操作相关推荐

  1. java7 文件_Java SE 7新特性之文件操作(9) - 遍历目录树

    在有些时候,我们可能需要遍历整个目录树,例如需要寻找所有的.java文件.Java SE 7提供了很方便的方法来实现这类的功能. Java SE 7提供的实现这类功能的方法就是FileVisitor接 ...

  2. 上传阿里云oss对象型存储 本地文件和上传流上传

    上传阿里云oss对象型存储 本地文件和上传流上传 import java.io.ByteArrayInputStream; import java.io.File; import java.io.Fi ...

  3. 微信开发h5图片上传(拍照、图片压缩、IOS照片旋转)

    微信开发h5图片上传 开发环境 vue.js,原生h5 input file, 微信公众号网页 依赖安装 exif-js:IOS下拍照照片的方向有问题, 需要exif-js来读取照片信息进行旋转处理: ...

  4. Springboot + layui + FTP文件上传删除 + HTTP文件下载预览 + pdf.js文件预览(项目实战总结)

    文件管理 0.需求及前言 1.前端,上传按钮嵌入数据表格中 2.利用IIS部署FTP文件服务器 3.后台FTP连接和文件操作 4.FTP遇到的问题和解决方案 5.预览PDF文件V1.0:FTP+临时文 ...

  5. uniapp h5拍照上传照片

    前段时间公司要弄一个uniapp的H5拍照上传的功能,看这位博主 常德_威少 的博客完成了(博客地址:使用canvas压缩图片大小_常德_威少的博客-CSDN博客_canvas压缩图片),于是想把我写 ...

  6. node 生产的env文件怎么注入_前端各种文件上传攻略,从小图片到大文件断点续传...

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

  7. 写给新手前端的各种文件上传攻略,从小图片到大文件断点续传

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

  8. 前端各种文件上传攻略,从小图片到大文件断点续传

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

  9. Android WebView 支持H5图片上传input type=file

    2019独角兽企业重金招聘Python工程师标准>>> Android WebView 缓存处理 Android WebView 支持H5图片上传<input type=&qu ...

最新文章

  1. 字符串反转python_python字符串反转的四种方法详解
  2. python opencv创建图像_使用Python中OpenCV库创建一幅图片的RGB通道图片
  3. ora-01033:oracle initializationgorshutdown 处理方法
  4. android-Bitmap,View,Canvas大综合
  5. python培训学校-培训Python学校哪家好?推荐老男孩IT培训机构
  6. 常用的PL/SQL开发原则 by dbsanke
  7. DBA(四):数据读写分离,MySQL多实例操作
  8. Grails动态下拉菜单
  9. MySQL高级-索引
  10. 用于指纹验证的C#框架
  11. linux 安装sysstat使用iostat、mpstat、sar、sa(转载)
  12. 重学C---------第五节:常量
  13. IOS 支付宝支付开发流程
  14. 直击架构本质:优秀架构师必须掌握的几种架构思维
  15. 吉林大学超星学习通05
  16. 8.声卡驱动03-自己实现alsa驱动-虚拟声卡-缓存
  17. 数组分为两部分,使得其和相差最小
  18. 我怎梦想是计算机科学家,我的梦想是当一名科学家作文
  19. Android 9.0 (P)
  20. golang 记一次data race排查过程

热门文章

  1. 一种被忽视的构造和整数溢出重现
  2. 美发新造型 名家创意示范集锦(图)
  3. 入行AI,你需要一本Python机器学习入门,赶紧收藏!
  4. 50道 JavaScript 经典面试题汇总篇
  5. 阿里云ubuntu mysql_Ubuntu下安装MySQL(阿里云服务器)
  6. 苹果html5跑分排行,UC浏览器HTML5跑分创新高 升全球第一
  7. 优化算法笔记|萤火虫算法理解及实现
  8. 如何在PD17虚拟机上安装CentOS Linux系统
  9. ae多线程渲染工具:BG Renderer MAX for Mac(AE插件)
  10. Python学习之快速入门