背景:

  之前的需求是根据接口中提供的Blob数据实现PDF下载,已实现代码如下:

 1          const url = window.URL.createObjectURL(newBlob([response.data],{type: 'application/pdf'})
 2             const link = document.createElement('a')
3 link.href = url
4 let filename = response['headers']['content-disposition']?.split('filename=')[1]
5 filename = decodeURI(filename)
6 link.setAttribute('download', filename)
7 document.body.appendChild(link)
8 link.click()
9 link.remove()
10 window.URL.revokeObjectURL(link.href)

思路就是: 获取Blob数据 => 更改Blob类型 => 转化为Blob URL => 生成a标签 => 设置名称 => 完成下载 => 去除a标签 => 释放Blob内存

新需求:   

 现 PRD 需要将直接下载更改为 浏览器在线预览
 思路:

  1.  利用a标签的href属性, 将接收到的Blob数据转化为Base64数据格式,并将其类型更改为PDF,代码如下:

    1     let fileReader = new FileReader();
    2   let blobData = new Blob([response.data], {type: 'application/pdf'})
    3 fileReader.readAsDataURL(blobData);
    4 fileReader.onload = function(){
    5 base64Data = fileReader.result;
    6 console.log('base64数据', base64Data)
    7 }

    此方法可以实现需求,但是在新版谷歌浏览器被禁止,报错如下

    Not allowed to navigate top frame to data URL:

    查询结果如下:

    Chrome 禁止从页面打开 Data URI 网址了,是出于安全考虑(钓鱼方面)。
    
    单击这个链接的话,会直接报错,Not allowed to navigate top frame to data URL
    
    Chrome 的人做了统计,说从非 Data URI 页面跳到 Data URI 页面的情况只有不到万分之五的概率,如果你的网站恰巧用到了这种在前端生成页面的方式,可以尝试迁移到后端来生成。
  2. 采用插件来实现,由于使用的是react框架,所以采用了react-pdf插件,此插件地址如下: 
    https://www.npmjs.com/package/react-pdf

    文档说明较少,使用较简单, 可以自定义样式, 灵活性较高, 但样式调整比较麻烦,而且有点点卡?

最终实现方法:

   由于前两种方法于PRD而言都有点瑕疵,最后恍然大悟,发现window.open一行代码可轻松解决,代码如下:

const url = window.URL.createObjectURL(newBlob([response.data],{type: 'application/pdf'})
window.open(url)

   之前只是记得window.open只能打开url,没想到Blob url也适用

Window.open()
Window 接口的 open() 方法,是用指定的名称将指定的资源加载到浏览器上下文(窗口 window ,内嵌框架 iframe 或者标签 tab )。如果没有指定名称,则一个新的窗口会被打开并且指定的资源会被加载进这个窗口的浏览器上下文中。 语法 let windowObjectReference = window.open(strUrl, strWindowName, [strWindowFeatures]);
strUrl === 要在新打开的窗口中加载的URL。 strWindowName === 新窗口的名称。 strWindowFeatures === 一个可选参数,列出新窗口的特征(大小,位置,滚动条等)作为一个DOMString。

   也是自己知识漏洞了. 这也是这偏随笔的原因. 
   关于Blob Url:

Blob URL(参考W3C,官方名称)或Object-URL(参考MDN和方法名称)与Blob或File对象一起使用。

Blob URL只能由浏览器在内部生成。URL.createObjectURL()将创建一个特殊的Blob或File对象的引用,以后可以使用它来发布URL.revokeObjectURL()。这些URL只能在浏览器的单个实例中和同一个会话中(即页面/文档的生命周期)在本地使用。

Blob URL / Object URL是一种伪协议,允许Blob和File对象用作图像,下载二进制数据链接等的URL源。

例如,不能处理Image对象的原始字节数据,因为它不知道如何处理它。它需要例如图像(二进制数据)通过URL加载。这适用于任何需要URL作为源的东西。不用上传二进制数据,而是通过URL提供回来,最好使用额外的本地步骤来直接访问数据而无需通过服务器。

对于编码为Base-64的字符串的Data-URI也是更好的选择。Data-URI的问题是每个char在JavaScript中占用两个字节。最重要的是,由于Base-64编码增加了33%。Blob是纯粹的二进制字节数组,它不像Data-URI那样具有任何重要的开销,这使得它们处理速度越来越快。
  1. 是一种伪协议
  2. 只能在浏览器内部生成
  3. 是Blob数据的唯一映射

  

记一次关于pdf 下载需求变更到 pdf 在线预览的更多相关文章

  1. 用pdf.js实现在移动端在线预览pdf文件

    用pdf.js实现在移动端在线预览pdf文件1.下载pdf.js    官网地址:https://mozilla.github.io/pdf.js/ 2.配置    下载下来的文件包,就是一个demo ...

  2. uploadify 下载组件使用技巧和在线预览 word,excel,ppt,pdf的方案

    http://www.cnblogs.com/wolf-sun/p/3565184.html uploadify 上传工具的使用技巧 http://www.cnblogs.com/wolf-sun/p ...

  3. WEB在线预览PDF

    这是我在博客园发表的第一篇文章.以后会陆续把在线预览其他格式文档的解决方案发表出来. 解决思路:把pdf转换成html显示. 在线预览pdf我暂时了解3种解决方案,欢迎大家补充. 方案一: 利用pdf ...

  4. 关于在线预览word,excel,ppt,pdf的需求处理方法。

    参考文档:http://www.cnblogs.com/wolf-sun/p/3574278.html 我选用的方案:先用office com组件生成pdf,然后使用pdf.js在线预览pdf文档.在 ...

  5. Java实现office文档与pdf文档的在线预览功能

    最近项目有个需求要java实现office文档与pdf文档的在线预览功能,刚刚接到的时候就觉得有点难,以自己的水平难以在三四天做完.压力略大.后面查找百度资料.以及在同事与网友的帮助下,四天多把它做完 ...

  6. FlexPaper+SWFTool+操作类=在线预览PDF

    引言 由于客户有在线预览PDF格式的需求,在网上找了一下解决方案,觉得FlexPaper用起来还是挺方便的,flexpaper是将pdf转换为swf格式的文件预览的,所以flexpaper一般和swf ...

  7. 在线预览PDF

    FlexPaper+SWFTool+操作类=在线预览PDF   引言 由于客户有在线预览PDF格式的需求,在网上找了一下解决方案,觉得FlexPaper用起来还是挺方便的,flexpaper是将pdf ...

  8. FlexPaper+SWFTool+操作类=在线预览PDF(转)

    引言 由于客户有在线预览PDF格式的需求,在网上找了一下解决方案,觉得FlexPaper用起来还是挺方便的,flexpaper是将pdf转换为swf格式的文件预览的,所以flexpaper一般和swf ...

  9. java实现word转pdf在线预览(前端使用PDF.js;后端使用openoffice、aspose)

    背景 之前一直是用户点击下载word文件到本地,然后使用office或者wps打开.需求优化,要实现可以直接在线预览,无需下载到本地然后再打开. 随后开始上网找资料,网上资料一大堆,方案也各有不同,大 ...

随机推荐

  1. 并发编程之:BlockingQueue

    大家好,我是小黑,一个在互联网苟且偷生的农民工. 队列 学过数据结构的同学应该都知道,队列是数据结构中一种特殊的线性表结构,和平时使用的List,Set这些数据结构相比有点特殊,它的特殊之处在于它只允 ...

  2. Intel® QAT加速卡之同步异步模式

    QAT 的两种操作模式 Intel QAT API同时支持同步和异步两种操作模式. 为了获得最佳性能,该应用程序应能够向加速引擎提交多个未完成的请求. 提交多个未完成的请求可最大程度地减少加速引擎上的 ...

  3. linux 命令进阶篇之二

    一.预备知识 选取init的进程. cat :由第一行开始显示文件内容 tac:由最后一行开始显示,有没有发现和cat是反过来写的 more:一页一页的显示内容 less:与more相似,但是可以往前 ...

  4. Vue开发多人聊天室 复盘总结

    前言 在上个月初,接到一个需求,要开发一个 聊天通讯 模块 并且 集成到 项目中的多个 入口,实现业务数据的记录追踪. 接到需求后,还挺开心,这是我第一次 搞 通讯 类的需求,之前一直是 B 端 的业 ...

  5. springmvc配置过程中遇到的一些问题总结

    springmvc配置过程中遇到的一些问题总结 1.配置tomcat过程中的错误: 2.配置web.xml中DispatchServlet报红(配置好已有依赖条件下) 解决的办法: 因为新添加依赖,m ...

  6. vue-cli3项目中使用vue-ueditor-wrap

    Vue + UEditor + v-model 双向绑定 一.安装 1 npm i vue-ueditor-wrap 2 # 或者 3 yarn add vue-ueditor-wrap 二.下载文件 ...

  7. 机器学习——K-Means算法

    1 基础知识 相似度或距离 假设有 $m$ 个样本,每个样本由 $n$ 个属性的特征向量组成,样本合集 可以用矩阵 $X$ 表示 $X=[x_{ij}]_{mn}=\begin{bmatrix}x_{ ...

  8. [CSP-J2020] 优秀的拆分

    [CSP-J2020] 优秀的拆分 难度:普及- 题目描述 一般来说,一个正整数可以拆分成若干个正整数的和. 例如,1=1,10=1+2+3+4 等.对于正整数 n 的一种特定拆分,我们称它为&quo ...

  9. CPU到底是什么东西?它为什么能够执行数学运算?

    CPU到底是什么东西?它为什么能够执行数学运算? 本文地址http://yangjianyong.cn/?p=20转载无需经过作者本人授权 简单的物理电路 先来看一张初中学过的物理电路图: 从图中我们 ...

  10. jquery监听动态添加的input的change事件

    使用下面方法在监听普通的input的change事件正常 $('#pp').on('change', 'input.videos_poster_input', function () { consol ...