在HTML5中,提供了一个关于文件操作的API,通过这个API,对于从web页面上访问本地文件系统的相关处理变得十分简单。到目前为止只有部分浏览器对它提供支持。
1.FileList对象和File对象
FileList对象表示用户选择的文件列表,在HTML4中file控件内只允许放置一个文件,但在HTML5中通过添加multiple属性,file控件内允许放置多个文件。控件内的每一个用户选择的文件都是一个file对象,而FileList就是这些file对象的列表,代表用户选择的所有文件。file对象有两个属性,一个是name,代表文件名不包含文件的路径;一个是lastModifiedDate,表示文件最后被修改的日期。
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset=‘UTF-8‘/> 5 <title>FileList and File </title> 6 <script type="text/javascript" language="JavaScript"> 7 function showFiles(){ 8 var file, 9 len = document.getElementById(‘file‘).files.length;//返回FileList文件列表对象 10 for (var i=0; i < len; i++) { 11 file = document.getElementById(‘file‘).files[i]; 12 alert(file.name); 13 }; 14 15 } 16 </script> 17 </head> 18 <body> 19 <input type="file" id=‘file‘ multiple="multiple" width="80px"/> 20 <input type="button" id="bt1" value="click" onclick="showFiles();"/> 21 </body> 22 </html>
2.Blob对象
提到Blob对象,估计有人会想起OracleDB中Blob字段,意义上有些类似。HTML5中Blob表示二进制原始数据,它提供一个slice()方法,可以通过这个方法访问到字节内部的原始数据块。事实上,上面提到的file对象继承了Blob对象。
Blob对象的两个属性,size:表示一个对象的字节长度。type:表示一个对象的MIME类型,如若是未知类型返回空字符串。
function showFileInfo(){ 2 var file = document.getElementById(‘file‘).files[0]; 3 var size = document.getElementById(‘fileType‘); 4 var type = document.getElementById(‘fileSize‘); 5 size.innerHTML = file.size; 6 type.innerHTML = file.type; 7 }
对于图像类型的文件,Blob对象的type属性都是以image/开头,可以利用这个特性对用户选择的文件类型做判断。
function showFileInfo(){ 2 var file = document.getElementById(‘file‘).files[0]; 3 if(checkImage(file)){ 4 var size = document.getElementById(‘fileType‘); 5 var type = document.getElementById(‘fileSize‘); 6 size.innerHTML = file.size; 7 type.innerHTML = file.type; 8 } 9 else{ 10 return ; 11 } 12 } 13 function checkImage(file){ 14 if(!/img\/\w+/.test(file.type)){ 15 alert(file.name + "不是图片"); 16 return false; 17 } 18 return true; 19 }
另外,file控件在HTML5标准中添加了accept属性,用来限制接受的文件类型,但目前各浏览器对齐支持都仅限于在打开文件选择窗口时默认的选择图像文件而已,如果选择其他类型,控件也能接受。
3.FileReader接口
3.1接口方法
FileReader接口提供了四个方法,其中3个用来读取文件,1个用来中断文件的读取。
方法名 | 参数 | 描述 |
readAsBinaryString() | file | 将文件读取为二进制字符串,通常将它传到后端,后端可以通过这段字符串存储文件 |
readAsDataURL() | file | 将文件读取为一段data url字符串,事实上是将小文件以一种特格式的URL地址直接读取到页面。小文件通常指图片与html等格式文件 |
readAsText() | file [encoding] | 将文件以文本的方式读取,其中第二个参数为文本的编码。 |
abort() | (none) | 中断读取操作。 |
需要注意的是,无论读取成功还是失败,方法都不会返回读取结果,结果返回在result属性中。
3.2接口事件
FileReader接口提供了一套完整的事件模型,用于捕获读取文件时的状态。
事件 | 描述 |
onabort | 数据读取中断时发生 |
onerror | 数据读取出错时发生 |
onloadstart | 数据读取开始时发生 |
onload | 数据读取成功完成时发生 |
onloadend | 数据读取完成时发生无论读取成功还是失败 |
onprogess | 数据读取中 |
3.3实例
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="utf-8" /> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> 6 <title>FileReader</title> 7 <meta name="description" content="" /> 8 <meta name="viewport" content="width=device-width; initial-scale=1.0" /> 9 <script type="text/javascript" language="JavaScript"> 10 var file , 11 result; 12 function myLoad() { 13 file = document.getElementById(‘file‘).files[0]; 14 result = document.getElementById(‘result‘); 15 } 16 if(typeof FileReader == ‘undefined‘){ 17 result.innerHTML = "你的浏览器不支持 FileReader"; 18 file.setAttribute("disabled","disabled"); 19 } 20 function readAsDataURL(){ 21 if(!/image\/\w+/.test(file.type)){ 22 alert(file.name + ‘不是一个图片类型的文件‘); 23 }else{ 24 var reader = new FileReader(); 25 reader.readAsDataURL(file); 26 reader.onload = function(e){ 27 28 result.innerHTML = "<img src=" + reader.result +"/>"; 29 }; 30 } 31 } 32 function readAsBinaryString(){ 33 var reader = new FileReader(); 34 reader.readAsBinaryString(file); 35 reader.onload = function(e){ 36 result.innerHTML = reader.result; 37 }; 38 } 39 function readAsText(){ 40 var reader = new FileReader(); 41 reader.readAsText(file); 42 reader.onload=function(e){ 43 result.innerHTML = reader.result; 44 }; 45 } 46 </script> 47 48 </head> 49 <body > 50 <p> 51 <input type="file" id=‘file‘/> 52 <input type=‘button‘ id="bt_DataURL" value="读取图片" onclick="readAsDataURL();"/> 53 <input type="button" id="bt_BinaryString" value="读取二进制字符串" onclick="readAsBinaryString();"/> 54 <input type="button" id="bt_textString" value="读取文本信息" onclick="readAsText();"/> 55 </p> 56 <div id="result"> 57 58 </div> 59 </body> 60 </html>