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

更新日期: 2018-10-06阅读: 3.5k标签: 文件

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实现文件读取、编辑、保存/


链接: https://fly63.com/article/detial/1123

h5移动端实现图片文件上传

PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现。

前端使用js读取文件操作

首先我们定义一个input标签type=file、然后我们定义一个jsReadFiles的方法将文件作为参数;当上传文件的时候读取这个文件。图片上传成功,只是图片路径变成了base64编码的形式。

血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息

在JavaScript文件中存储敏感数据,不仅是一种错误的实践方式,而且还是一种非常危险的行为,长期以来大家都知道这一点。

在js文件中引入另一个js文件的实现方法总汇

比如我写了一个JS文件,这个文件需要调用另外一个JS文件,该如何实现呢?这篇文章主要介绍:在js文件中引入另一个js文件的实现

使用HTML5来实现本地文件读取和写入

最近有这样一个需求,就是在HTML页面中有个按钮导出,点击它,将构造一个文档并存储到本地文件系统中。另外还有个按钮,点击它,从本地文件系统中读取一个文件并对内容进行分析。

lock文件_我们为什么需要 lock 文件

从 Yarn 横空出世推出 lock 文件以来,已经两年多时间了,npm 也在 5.0 版本加入了类似的功能,lock 文件越来越被开发者们接收和认可。本篇文章想从前端视角探讨一下我们为什么需要 lock 文件,以及它的一些成本与风险,当然其中一些观点对于后端也是适用的

什么是断点续传?前端如何实现文件的断点续传

什么是断点续传?就是下载文件时,不必重头开始下载,而是从指定的位置继续下载,这样的功能就叫做断点续传。前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段段将文件进行拼接。

form表单文件上传_multipart/form-data文件上传

form表单的enctype属性:规定了form表单数据在发送到服务器时候的编码方式.。application/x-www-form-urlencoded:默认编码方式,multipart/form-data:指定传输数据为二进制数据,例如图片、mp3、文件,text/plain:纯文本的传输。空格转换为“+”,但不支持特殊字符编码。

使用HttpClient发送文件流到服务器端

适用场景: 网络绝对路径的URL文件或图片,不存储到本地,转换成stream,直接使用HTTPClient传送到SpringBoot的服务端,将文件存储下来,并返回一个文件地址。目前分层架构的系统越来越多这种需求,所以记录下来以备不时之需。

PHP上传文件到阿里云OSS,nginx代理访问

阿里云OSS创建存储空间Bucket(读写权限为:公共读),拿到相关配置创建 oss.php 上传类 (基于thinkPHP5),访问 oss域名地址 不可在浏览器直接访问 可用nginx 代理

点击更多...

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