JavaScript---FileReader、Blob、File 文件处理对象

JavaScript文件处理对象


一、 class FileReader

该对象属于class对象,继承自 EventTarget,用于加载文件类型数据。

FileReader.proto === EventTarget
FileReader.prototype.proto === EventTarget.prototype
EventTarget.proto === Function.prototype

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

FileReader仅用于以安全的方式从用户(远程)系统读取文件内容 它不能用于从文件系统中按路径名简单地读取文件。


  • 方法&读取

    下列方法为读取数据文件,一旦开始读取,实例的 result属性都会被填充。读取失败,则 result的值为 null,否则即是读取的结果

    FileReader.readAsArrayBuffer(file)			-- 将文件读取ArrayBuffer对象
    FileReader.readAsBinaryString(file)			-- 将文件读取为二进制码
    FileReader.readAsDataURL(file)				-- 将文件读取为 DataURL
    FileReader.readAsText(file)					-- 将文件读取为文本
    
  • 方法&中断

    FileReader.abort()				中止读取操作。在返回时,readyState属性为DONE。
    
  • 属性

    FileReader.error 				只读	一个DOMException,表示在读取文件时发生的错误 。
    FileReader.readyState 			只读	表示FileReader状态的数字。取值如下:
    
      										常量名		值		描述
      										EMPTY		0		还没有加载任何数据.
      										LOADING		1		数据正在被加载.
      										DONE		2		已完成全部的读取请求.
      										
    FileReader.result				只读 	文件的内容。该属性仅在读取操作完成后才有效,数据
    										的格式取决于使用哪个方法来启动读取操作
    
  • 事件处理

    因为 FileReader 继承自EventTarget,所以所有这些事件也可以通过addEventListener方法使用。

    FileReader.onabort				处理abort事件。该事件在读取操作被中断时触发。
    FileReader.onerror				处理error事件。该事件在读取操作发生错误时触发。
    FileReader.onloadstart			处理loadstart事件。该事件在读取操作开始时触发。
    FileReader.onprogress			处理progress事件。该事件在读取Blob时触发。
    FileReader.onload				处理load事件。该事件在读取操作完成时触发。
    FileReader.onloadend			处理loadend事件。该事件在读取操作结束时(要么成功,要么失败)触发。
    

二、Blob 构造函数

该对象属于顶层内置构造函数,构造二进制类型文件。

Blob.proto === Function.prototype
Blob.prototype.proto === Object.prototype

Blob 对象表示一个不可变、原始数据的类文件对象。Blob 对象表示的不一定是JavaScript原生格式的数据。File 类(class) 继承了 Blob 构造函数的功能并将其扩展使其支持用户系统上的文件。要从其他非Blob对象和数据构造一个Blob对象,请使用 Blob()构造函数。

要创建包含另一个Blob对象数据的子集Blob对象,请使用 Blob.slice()方法。要获取用户文件系统上的文件对应的Blob对象,请参查阅File函数对象的使用。接受Blob对象的API也被列在 File 函数文档中。


  • 构造

    var aBlob = new Blob(array, options);

  • 属性

    Blob.size 						只读	Blob 对象中所包含数据的大小(字节)。
    Blob.type 						只读	一个字符串,表明该Blob对象所包含数据的MIME类型。如果类型未知,则该值为空字符串。
    
  • 方法

    Blob.slice(start, end, contentType)
    

    Blob() 构造函数 允许用其它对象创建 Blob 对象。比如,用字符串构建一个 blob

      	var debug = {hello: "world"};
      	var blob = new Blob([JSON.stringify(debug, null, 2)],
      	  {type : 'application/json'});
    

    从Blob中读取内容的唯一方法是使用 FileReader。以下代码将 Blob 的内容作为类型数组读取

     	var reader = new FileReader();
     	reader.addEventListener("loadend", function() {
     		// reader.result 包含转化为类型数组的blob
     	});
     	reader.readAsArrayBuffer(blob);
    

三、class File

继承自 Blob构造函数

File.proto === Blob
File.prototype.proto === Blob.prototype

通常情况下, File 对象是来自用户在一个<input>元素上选择文件后返回的 FileList 对象,也可以是来自由拖放操作生成的DataTransfer对象,或者来自 HTMLCanvasElement 上的 mozGetAsFile() API。File 对象是特殊类型的Blob,且可以用在任意 Blob 类型的 context 中。比如说, FileReader, URL.createObjectURL(), createImageBitmap(), 及 XMLHttpRequest.send() 都能处理 Blob和 File。


  • 构造

    var myFile = new File(bits, name, options)

  • 属性
    File 接口也继承了 Blob 接口的属性

      File.lastModified 			只读 	返回当前 File 对象所引用文件最后修改时间, 自 1970年1月1日0:00 以来的毫秒数。
      File.lastModifiedDate 		只读 	返回当前 File 对象所引用文件最后修改时间的 Date 对象。
      File.name 					只读 	返回当前 File 对象所引用文件的名字。
      File.size 					只读 	返回文件的大小。
      File.webkitRelativePath		只读 	返回 File 相关的 path 或 URL。
      File.type						只读 	返回文件的 MIME 类型
    
  • 方法
    File 接口没有定义任何方法,但是继承了 Blob 接口的方法。


四、示例(多文件上传):


Html:

	/*multiple 属性规定输入字段可选择多个值。*/
	<input type="file" id="inupuId" onchange="showImg(this)" multiple="multiple" 
		accept="image/x-png, image/jpg, image/jpeg, image/gif">

	<div id="imgDiv"></div>
	<button id="addEleButton" style="display:none">添加</button>

JavaScript:

	function showImg(file){
		for(var i=0;i<file.files.length;i++){
			console.log(JSON.stringify(file.files[i]))
			/*定义一个FileReader对象*/
			var rf = new FileReader();
			/*从INPUT元素中获取File对象*/
			rf.readAsDataURL(file.files[i]);
			/*使用FileReader对象来处理File对象*/
			rf.onload = function(event){
				/*获取结果数据*/
				/*event.target 属性返回哪个 DOM 元素触发了事件。*/
				var srcpath = event.target.result;
				var img = document.createElement("img");
				img.src = srcpath;
				img.style.width = "200px";
				img.style.height = "aotu";
				$("#imgDiv").append(img);
				$("#addEleButton").show();
			}
		}
	}
	/*触发点击事件,移除文件*/
	$("#imgDiv").click(function(event){
		/*移除当前点击元素*/
		event.target.parentNode.removeChild(event.target);
		$("#inupuId").trigger("click");//触发被选元素的事件类型
	})
	/*触发点击事件*/
	$("#addEleButton").click(function(){
		$("#inupuId").trigger("click");
	})

猜你喜欢

转载自blog.csdn.net/weixin_41087220/article/details/89250643