一:文件读取

a:创建文件读取对象new FileReader() 异步读取;

  1. var reader = new FileReader(); // 创建一个文件读取对象
  2. reader.onload = function () { // 监听文件读取成功的回调
  3. console.log(read.reault) // 读取的结果
  4. }
  5. reader.readAsText(file) // 以文本的形式读取文件
  6. reader.readAsDataURL(file) // 以URL格式的Base64字符串以表示所读取文件的内容。

b: 读取的方法:

1、reader.abort(); 中断读取文件,返回时readyState状态为DONE;
2、reader.readAsText(file) // 以文本的形式读取文件
3、reader.readAsDataURL(file) // 以URL格式的Base64字符串以表示所读取文件的内容。

c:监听事件

1、reader.onloadstart = function (){}; 开始文件读取事件
2、reader.onloadend = function (){}; 文件读取结束时触发
3、reader.onload = function () {}; 文件读取完成时触发
4、reader.onabort = function(){}; 文件读取中断时触发
5、reader.onerror = function(){}; 文件读取失败时触发
6、reader.onprogress = function(){{}; 文件读取过程中触发

d:reader.result 文件读取的结果

二:文件的分割:

1、FileReader.readyState 返回常量名

  1. **EMPTY (0)** : 还没有加载任何数据<br /> **LOADING1)**:数据正在被加载<br /> **DONE**(2):已完成全部的数据请求<br />可以和事件对象中的e.target.readyState返回的状态码进行判断文件读取的情况
  1. var read = new FileRead();
  2. read.onloadend = function (e) {
  3. if (e.target.readState === FileRead.DONE){ // 2 判断读取状态
  4. }
  5. }

三:拖曳文件

  1. section.addEventListener('drop', function (e) {
  2. e.preventDefault();
  3. stopPrevent();
  4. var file = e.dataTransfer.files[0]; // e.dataTransfer对象中存有文件列表
  5. // 之后进行文件读取上传等操作
  6. }, false)
  7. function stopPrevent () { // 阻止拖曳上的默认事件
  8. document.addEventListener('dragenter', function (e){
  9. e.preventDefault();
  10. }, false)
  11. document.addEventListener('dragover', function (e){
  12. e.preventDefault();
  13. }, false)
  14. document.addEventListener('dragleave', function (e){
  15. e.preventDefault();
  16. }, false)
  17. document.addEventListener('drop', function (e){
  18. e.preventDefault();
  19. }, false)
  20. }

四:文件上传

  1. // 获取到文件
  2. var fd = new FormData();
  3. fd.append('file', file)
  4. var xhr = new XMLHttpRequest();
  5. xhr.open(url, 'POST');
  6. xhr.upload.onprogress = function () {
  7. //ajax传输过程触发
  8. }
  9. xhr.send(fd)

五:blob文件读取(同步)

1、概念:

在Web中,Blob类型的对象表示不可变的类似文件对象的原始数据,通俗点说,就是Blob对象是二进制数据,但它是类似文件对象的二进制数据,因此可以像操作File对象一样操作Blob对象,实际上,File继承自Blob。
a标签中的download当前跳转地址是同源的

  1. <body>
  2. <a href="" id="btn" target="blank">点击下载</a>
  3. <script>
  4. let str = '1234'
  5. let blob = new Blob([str], {
  6. type: 'text/plain',
  7. // endings
  8. })
  9. btn.onclick = function (e) {
  10. // console.log(blob);
  11. this.setAttribute('download', 'demo.html');
  12. let href = URL.createObjectURL(blob)
  13. console.log(href);
  14. this.href = href
  15. }
  16. </script>
  17. </body>

URL.createObjectURL(blob); 只能将blob对象文件变成url

  1. <input type="file" id="file">
  2. <script>
  3. file.onchange = function (e) {
  4. let file = e.target.files[0];
  5. let src = URL.createObjectURL(file)
  6. console.log(src);
  7. let oImg = new Image();
  8. oImg.src = src;
  9. document.body.appendChild(oImg)
  10. }
  11. </script>

2、使用

a:创建blob对象:

var blob = new Blob( Array, options)
Array 是一个由ArrayBuffer, ArrayBufferView, Blob, DOMString 等对象构成的 Array ,或者其他类似对象的混合体,它将会被放进 Blob。DOMStrings会被编码为UTF-8。
options: { type: ‘’, endings : ‘’ }
type: 表示文件的MIEE类型文件
endings: 默认值为”transparent”,用于指定包含行结束符\n(换行)的字符串如何被写入。 它是以下两个值中的一个: “native”,代表行结束符会被更改为适合宿主操作系统文件系统的换行符(\r 回车 \n 换行),或者 “transparent”,代表会保持blob中保存的结束符不变

b: blob对象中的属性介绍

  1. let str = '1234'
  2. let blob = new Blob([str], {
  3. type: 'text/plain' // str为 MIEE类型
  4. })
  5. // blob.size :表示该str文件的字节数
  6. // blob.type: 表示文件的类型

c: 方法介绍

1、blob.slice(start, end); 对blob(二进制文件进行按字节截取); 返回分割后的blob
2、blob.text(); 方法返回一个 Promise (resolve)对象,包含 blob 中的内容,使用 UTF-8 格式编码。
3、blob.stream();

注意:

实际上file文件类型也就是继承自blob(二进制对象)的一个类型

blob使用场景(分文件上传)

Blob.prototype.slice()对blob(二进制类型文件进行分割进行分文件上传)

  1. var data = "abcdef";
  2. var blob1 = new Blob([data]);
  3. var blob2 = blob1.slice(0,3); // 以字节数进行分割
  4. console.log(blob1); //输出:Blob {size: 6, type: ""}
  5. console.log(blob2); //输出:Blob {size: 3, type: ""}
  6. console.log(blob2.text()) // promise成功状态的值为abc