JavaScript中读取和保存文件实例 |
话说今天只是粗略浏览了一下Proxy SwitchySharp的源码,就收获了不少东西,其中就包括本文要介绍的读取和保存文件 。 首先说读取文件 。W3C提供了一些File API,其中最重要的是FileReader这个类 。 先列出需要用到的HTML标签: 复制代码 代码如下: <input type="file" id="file" onchange="handleFiles(this.files)"/> 当选择了一个文件时,就会把包含这个文件的列表(一个FileList对象)作为参数传给handleFiles()函数了 。 这个FileList对象类似一个数组,可以知道文件的数目,而它的元素就是File对象了 。 从这个File对象可以获取name、size、lastModifiedDate和type等属性 。 把这个File对象传给FileReader对象的读取方法,就能读取文件了 。
有了这些方法以后,就可以处理文件了 。 复制代码 代码如下: function handleFiles(files) { if (files.length) { var file = files[0]; var reader = new FileReader(); if (/text\/\w+/.test(file.type)) { reader.onload = function() { $(<pre> + this.result + </pre>).appendTo(body); } reader.readAsText(file); } } }
再来试试图片,因为浏览器可以直接显示Data URI协议的图片,所以这次就添加图片: 复制代码 代码如下: function handleFiles(files) { if (files.length) { var file = files[0]; var reader = new FileReader(); if (/text\/\w+/.test(file.type)) { reader.onload = function() { $(<pre> + this.result + </pre>).appendTo(body); } reader.readAsText(file); } else if(/image\/\w+/.test(file.type)) { reader.onload = function() { $(<img src=" + this.result + "/>).appendTo(body); } reader.readAsDataURL(file); } } } 其实input:file控件还支持选择多个文件: 复制代码 代码如下: <input type="file" id="files" multiple="" onchange="handleFiles(this.files)"/> 这样handleFiles()里就需要遍历处理files了 。 如果只想读取部分数据的话,File对象还有webkitSlice()或mozSlice()方法,用于生成Blob对象 。这个对象可以和File对象一样被FileReader读取 。这2个方法接收3个参数:第1个参数是起始位置;第2个是结束位置,省略时则读到文件结尾;第3个是content type 。 当然,除了导入数据和显示文件以外,它还可以用来做AJAX上传,代码可以参考《Using files from web applications》 。
BlobBuilder可以创建一个Blob对象 。把这个Blob对象传递给URL.createObjectURL()方法,就可以拿到一个object URL 。而这个object URL就是这个Blob对象的下载地址 。 下面就是一段化简的代码: 复制代码 代码如下: var BlobBuilder = BlobBuilder || WebKitBlobBuilder || MozBlobBuilder; var URL = URL || webkitURL || window; function saveAs(blob, filename) { var url = URL.createObjectURL(blob); var event = document.createEvent(MouseEvents); var bb = new BlobBuilder;
|