HTML5实现文件读取、编辑、保存

时间: 2018-10-06阅读: 1269标签: 文件

html5读取文件

html5读取文件主要利用的就是FileReader这个API,它的使用需要从一个构造函数开始:

var reader = new FileReader();      // 返回一个FileReader实例

返回的实例具有以下3个属性:

  • FileReader.result
  • FileReader.readyState
  • FileReader.error

其中result属性是文件读取成功后的读取结果,数据的格式取决于使用哪个方法来启动读取操作。

FileReader实例具有以下4个方法:

  • FileReader.readAsText()
  • FileReader.readAsDataURL()
  • FileReader.readAsArrayBuffer()
  • FileReader.abort()

前3个方法分别是以文本、图片、其他格式读取内容,读取的对象可以是BolbFile,在读取本地文件的场景下,我们读取的实际上就是File。

reader.readAsText(file);    //读取文本文件

FileReader.abort()方法不需要说了,就是中断文件读取。

同时FileReader实例具有以下6个事件:

  • FileReader.onprogress
  • FileReader.onloadend
  • FileReader.onloadstart
  • FileReader.onload
  • FileReader.onerror
  • FileReader.onabort

其中onload事件是我们最关心的一个,该事件将在读取操作完成时触发,在这个事件中我们才能访问到FileReader.result属性,得到读取结果。

reader.onload = function() {
    console.log(this.result);       //文本内容
};

使用FileReader读取文件的整个流程就是这样,File对象我们可以通过<input type="file" >获取。


HTML5保存文件

保存文件的关键是生成文件对象,可以使用URL.createObjectURL()方法实现,该方法能返回给定对象的URL,用在<a>标签的href属性上就可以创建可下载的文件链接。

let DownloadDom = document.getElementById("Download");      // a标签
DownloadDom.href = window.URL.createObjectURL(myBlob);      // 生成下载链接


createObjectURL()方法的参数可以是File对象或者Blob对象,前端保存文件通常是希望将已有“内容”保存成文件,这种场景我们需要的是Blob对象。

Blob构造函数可以根据传入的数组数据返回Blob对象,数组可以是ArrayBuffer、ArrayBufferView、Blob、DOMString,假如我们希望将一段jsON字符串保存成jsON文件,那么可以这么做:

let myBlob = new Blob(['{"hello":"world"}'], { type: "application/json" });     //Blob对象


关于Blob构造函数的详细用法可以从这里了解。

有了createObjectURL和Blob,实际上,我们就可以封装一个方法,将任意字符串保存成文件,并点击链接下载:

let saveFile = function(fileText) {
    let DownloadDom = document.getElementById("Download");
    if (this.DownloadDom) {
        let myBlob = new Blob([fileText], { type: "application/json" });
        this.DownloadDom.href = window.URL.createObjectURL(myBlob);
        console.log('下载文件已就绪')
    }
},


结合HTML5读取文本文件功能,我们还可以实现对文本文件的编辑功能,比如JSON文件压缩,实际上就是拿到文本内容后,对内容过滤空字符:

let fileText = reader.result;
fileText.replace(/\s/g, "");
saveFile(fileText)


再补充一点内容,createObjectURL()方法还有一个对应的URL.revokeObjectURL()方法,用来释放生成的URL对象,用法是这样的:

var obj_url = window.URL.createObjectURL(blob);
var iframe = document.getElementById('viewer');
iframe.setAttribute('src', obj_url);
window.URL.revokeObjectURL(obj_url);


当obj_url已经赋值给图片之后,就可以释放这个URL对象。这里的关键在于确定URL对象已经使用完了,在我们的例子中如果也这么做,实际上是不行的,当用户点击下载链接的时候会提示网络错误,因为href指向的链接已经失效了。猜测原因是,图片加载并显示的时候已经将数据载入内存了,这时候释放URL不会影响到图片的显示;而链接地址属于“引用”,点击瞬间会去访问URL对象,如果这时候对象已经释放了就会导致链接失效。


小结

HTML5实现文件读取、编辑、保存其实非常简单,只不过涉及到的API兼容性都比较堪忧,以上示例仅在chrome里测试过。

完整的示例代码地址:https://github.com/tower1229/htm5-file-operations
演示地址:https://refined-x.com/htm5-file-operations/
前端路上原创技术文章,转载请注明出处:https://refined-x.com/2018/09/03/HTML5实现文件读取、编辑、保存/


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/1123

关闭

前端实现.md文件转换成.html文件

.md文件是markdown的一种标记语言,和html比较起来,更简单快捷,主要体现在:标记符的数量。使用i5ting_toc插件、gitbook来生成

CSS文件里引入另一个CSS文件

在HTML中引入css的其中的两个方法:使用链接式、使用导入式;使用链接式时,会在装载页面主体部分 之前装载css文件,这样现实出来的页面从一开始就是带有样式效果的

html5中利用FileReader来读取文件

利用FileReader来读取文件的能够来实现即时预览的效果,这个也是在html5中才有的功能,readAsText():读取文本文件(可以使用TxT打开的文件),返回文本字符串,默认编码是UTF-8

PHP遍历目录和文件及子目录和文件

正常直接使用opendir方法,就可以读到所有的目录和文件。文件可以直接记录下来,目录则需要再进一步获取里边的文件信息。也就是,如果当前读出来是目录,则需要再次调用函数本身(递归)

vue 查看dist文件里的结构

优化打包后的代码,提高性能。方式一:report-json。package.json文件里加入以下命令,然后控制台运行 npm run report结果:会在dist文件夹里生成 report.json。里面有打包后每个文件的来源。

nodejs如何调用其他的js文件内容?

将其他js文件与nodejs文件放在同一目录下,然后在nodejs文件中使用require(\\\'js文件路径\\\');将其他js文件引入到nodejs文件中,就可以直接调用其他js文件内容了。

vue读取本地的excel文件并显示在网页上

我想实现读取一个本地的xlsx文件(task_list.xlsx)然后显示在网页上, 一开始选择的方法是建个express server, 通过发送axios请求来实现, 但是觉得只是读取一个本地文件还要搞个server太复杂了

Node.js之删除文件夹(含递归删除)

应用场景:比如像Eclipse这样的IDE,右击项目,出现选项,点击选项中的删除,就可以删除这个项目及其下的子目录包含文件(使用electron开发的桌面端项目多少都会用到)。

解决nginx和php使用ckfinder无法上传大文件的问题

cms内容发布系统上传不了大文件,当上传超过32M文件时就上传不了,提示:无效的文件. 文件尺寸太大。分析文件上传过程:browser --> nginx --> php ,需要修改 nginx.conf和php.ini

将数组转化为 csv 文件类型的代码

将一个数组转化为逗号为分割符的字符串(CSV)即表格数据。利用了 Array.prototype.map() 和 Array.prototype.join() 两个函数,实现了一个简单的数组转化为 csv 文件类型的代码。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!