HTML文档的Base64编码预览

背景

最开始,后端同学许诺给前端返回一个链接,前端只用简单的使用window.open打开即可,简直不要太简单。然而反转开始了,一天后端同学反馈没法提供给我链接(别问我为什么无法实现,我要是知道我不就成全栈了嘛),只能先将一个html页面 =>流 =>Base64编码,前端拿着这个大字符串想办法把页面完整渲染出来。

分析

通过上面的背景,我们可以简单的归纳为前端需要将Base64编码展示成一个独立页面。首先我肯定第一时间跑到网上去看看有没有作业可抄,结果当然木有。回来回想一下也正常,一般一个html格式文件给前端最简单的方式就是给链接,谁会瞎折腾转换来转换去的。
分解步骤如下:

  1. 转换Base64编码为Blob二进制流
  2. 根据二进制流转换成html实际内容的字符串文本
  3. 新开页面,在新页面中写入该html结构的字符串

动手环节

转换Base64编码为Blob二进制流

一般来说,前端拿到Base64编码的字符串没法直接操作,需要先转换成贴近实际文件的文件流Blob格式(如果不清楚Blob,可参考这里JS中的Blob对象)。其中需要注意关键Api是window.atob,浏览器原生方法,还有下面代码的{ type: fileType || 'pdf' } 中的fileType是MIME类型。关键代码如下:

// base64转blob
function parseBase64ToBlob(dataUrl, fileType) {
  const bstr = window.atob(dataUrl)
  let n = bstr.length
  const u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new Blob([u8arr], { type: fileType || 'pdf' })
}

let base64Str = "xxxxxx";//实际base64字符串
parseBase64ToBlob(base64Str,'text/plain');//text/plain原文格式
根据二进制流转换成html实际内容的字符串文本

现在拿到Blob对象了,该怎么转换成明文(也就是开发人员能看懂的页面结构明文)呢?在得出结论前,我做了如下尝试,通过URL.createObjectURL(myBlob)得到如下效果

blob.png

好了,这就是我们开发人员能看懂的字符串了,接下来我就在想怎么提取出来。网上一搜,这篇帖子给了我实现方案js中Blob转字符串,此步骤代码如下:

var reader = new FileReader();
reader.onload = function(event){
    var content = reader.result;//实际内容就在这里
};
reader.readAsText(myBlob); //步骤一转换后的blob
新开页面,在新页面中写入该html结构的字符串

直接参考js 打开空白页,并在空白页里展现内容 代码

var html="html代码";
var open = window.open("about:blank", "_blank");
open.document.write(html);

完整代码

好了,经过上面三个步骤我们已经可以实现想要的效果,下面就是把三个步骤的代码合并一下,详细代码如下:

/**
 *
 * @param {*} base64Str 预览html base64编码的页面
 * @param {*} fileType 转换的文件类型
 */
export function previewHtmlByBase64(base64Str, fileType) {
  if (base64Str) {
    const myBlob = parseBase64ToBlob(base64Str, fileType)
    window.open(URL.createObjectURL(myBlob))
    const reader = new FileReader()
    reader.onload = function (event) {
      const content = reader.result // 内容就在这里
      const open = window.open('about:blank', '_blank')
      open.document.write(content)
    }
    reader.readAsText(myBlob)
  }
}

function parseBase64ToBlob(dataUrl, fileType) {
  const bstr = window.atob(dataUrl)
  let n = bstr.length
  const u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new Blob([u8arr], { type: fileType || 'pdf' })
}

let taxBase64 = "xxxxx";//替换成实际base64编码字符串
previewHtmlByBase64(taxBase64, 'text/plain');
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASC...
    大成小栈阅读 368评论 0 5
  • 之前写过一篇“漫谈前端优化”的文章,里面提到过DataUrl,粗鲁的描述了下,感觉不甚详焉,所以这几天也总结了这方...
    我是强强阅读 2,480评论 0 0
  • 图片处理在前端工作中可谓占据了很重要的一壁江山。而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从...
    小伟_be27阅读 16,130评论 0 7
  • 1.什么是BASE64编码 BASE64就是一种基于64个可打印字符来表示二进制数据的方法。换句话说,就是将二进制...
    p_in_phd阅读 650评论 0 1
  • Web前端开发工程师是一个很新的职业,是从事Web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制...
    Web前端小辰阅读 2,404评论 0 4