整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

炸裂!!用SingleFile把网页保存成html,一个文件就搞定

我们浏览网页时可能需要把网页上的内容保存下来,这时候有几种方式可以做到:1、把重要的内容复制出来;2、对网页进行截图保存,我们推荐过的截图插件如印象笔记·剪藏、Full Page Screen Capture等;3、把网页保存成PDF,如Adobe Acrobat。4、直接把网页保存成HTML。当然所有浏览器都有另存页面为HTML 文档的功能,不过可能会遇到一些问题,保存后不是各种资源如JS、CSS和图片的文件很多,就是打开后无法载入样式表,图片显示不出来,要把网页备份起来或传送给别人就很麻烦。本文要介绍的SingleFile是一款免费浏览器扩展,可以将完整的页面保存到一个HTML文件中,包括所有CSS和图片等等,让用户即使在一个HTML文档中也能浏览完整内容。除了单一页面外,SingleFile还支持保存选中的部分、非固定标签页或所有页面,操作上也非常的简单易用。如果你有保存页面的需求,可以试试这款插件。


简介

SingleFile

换流的作用就是将我们的字节流转换成字符流

字节流是可以处理一切内容的,包括图片,音频,视频,也包括纯文本,在很多系统和框架的底层返回给我们的都是字节流(有时候我们使用字节流处理并不方便,这就是我们为什么要转换字符流的原因)

System.in,System.out都是字节流,因为我们键盘输入还是输出的都是字符串,所以我们可以对它进行转换。

在我们的底层,如果是纯文本的话就涉及到一个东西是字符集。将字节转成字符叫做解码(在解码的过程中就涉及到字符集的问题,如果工程的字符集跟源头(文件)的字符集不统一就会出现乱码),所以这个时候我们最好可以指定字符集

从字节流到字符流的转换

只要我们看见Reader都建议加一个BufferedReader

将写入的字符编码为字节

讲一下什么使用字节流,什么时候使用字符流

其实底层都是字节,我们使用字符是为了处理一些文本和字符串提高性能字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列

字节流和字符流的使用:


Java IO流中提供了两种用于将字节流转换为字符流的转换流。其中InputStreamReader用于将字节输入流转换为字符输入流,其中OutputStreamWriter用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集


讲一下缓存流和转换流的结合,看见Reader我们就可以使用缓存流提高性能

使用转换流实现字节到字符的转换以及输入和输出

· 节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.

· 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

讲一下什么是节点流

字符流和字节流就可以叫做节点流

出现乱码的原因有两种:

1.字节数不够出现乱码

2.字符集不统一出现乱码

html文件的下载,如何使用字节流,如何使用转换流

在java中文件的传输其实就是靠流来实现的,网络流也是属于字节流,所以我们先使用字节流

我觉得写的时候应该是全部都写出来才写的,具体debug才知道,我这里就不弄了

为什么读取的时候乱码,写入的时候不乱码

忽然一下子自己就懂了,总之写入的时候只要讲字符集设置的和源头的文件一致就可以了

前端项目开发的时候,系统支持文件下载是前端开发中常用到的功能之一,当用户访问我们的网站时发现有自己需要的资源时可以将资源下载下来。文件下载主要有两种形式,一种是通过文件地址下载,该文件可以存放在前端或者后端。另一种则是通过文件流下载,前端通过发送请求给后端并获取后端文件流进行下载。

a标签下载

download属性:是HTML5中的a标签的新特性,用来规定被下载的超链接目标。在a标签中如果没有申明download属性的时a标签的默会链接跳转进行预览(如txt , jpg , pdf ),当前浏览器不支持预览的文件时则出现下载。当申明了download属性之后浏览器会对href属性链接的文件进行下载。download属性与不支持H5的低版本浏览器不兼容且仅限于同源文件,如果是非同源download属性会失效。比如引用第三方的网站内容、引用前后端分离的服务器内容、甚至本地测试引用的本地文件,download都会不起作用。如果你想测试该功能可以在本地开一个服务,将文件放同一服务中测试就可以了。

直接使用a标签时只要在a标签中添加download属性,如果是非a标签的话可以在出发事件的时候通过JavaScript来创建一个隐藏a标签下载,当我们点击时触发隐藏的a标签下载事件。这里使用appendChild和removeChild的处理是为了兼容Firefox浏览器。

XMLHttpRequest下载

需要了解XMLHttpRequest可以参考文章:JavaScript实战001:XMLHttpRequest使用入门,这里我利用XMLHttpRequest对象来发送请求,用blob类型来接受后台发过来的二进制类型文件。然后模拟a标签创建隐藏的下载链接,通过URL.createObjectURL()方法创建一个指向blob对象的URL地址。

iframe下载

iframe是HTML标签元素,可以用来创建内联框架。iframe提供了src属性用来规定在 iframe 中显示的文档的 URL,我们可以直接将文件地址抛给iframe,也可以赋值文件流地址给iframe。功能实现跟a标签有点相似,创建一个隐藏的iframe标签来实现文件的下载功能。使用文件地址下载需要注意的是浏览器支持预览的文件类型无法下载(比如图片、PDF文档、text文本等会直接打开文件预览),文件流下载只需将请求接口赋给src属性,iframe会自动去请求该文件实现下载。

window.open下载

window.open()方法用于打开一个新的浏览器窗口或查找一个已命名的窗口,也可以用它来实现文件下载功能。而且这个比iframe更简单,直接将文件地址或者请求接口赋给window.open(url)方法即可实现文件下载功能。但是有个缺点就是每次下载都会打开一个新的窗口来实现下载(想不跳转可以尝试window.location.assign()方法,用于加载一个新的文档),而且如果使用文件地址下载的是浏览器支持预览的文件类型无法下载(比如图片、PDF文档、text文本等会直接打开文件预览)。

form表单提交下载

form表单是个比较常用的html表签,用户提交用户信息,比如常见的登录、注册界面大部分都是通过form表单进行数据提交的。form表单所有要提交的数据都必须放在form标签中,method属性定义提交的方法(有get和post两种提交方法),action属性定义请求的地址。form标签中支持input、menus、textarea、fieldset、legend 和 label 等元素,通过submit向服务器提交数据。这里我创建了form表单和input框,input用于输入请求的参数,form用于提交数据请求。

Django后台接口

这里提供下Django的后台文件请求接口,以上文件请求都是基于该接口实现的。接收请求方法为GET,请求参数为id(数据库存储的文件id),采用FileResponse方式返回的文件流信息(具体实现功能可以参考文章:Django实战013:各种文件下载功能实现详解)。

总结:

下载的方式方法有很多,以上只是JavaScript中常见的几种下载方式。其实用ajax或者axios也可以实现下载,但是万变不离其中,会JavaScript下载害怕不会别的么。以上下载方式个人觉得还是iframe比较简单方便,请求最好还是通过文件流来实现,相对文件地址下载会更安全些。

更多前端技巧可以参考专栏:Vue实战技巧