新需求

最近接到一个新的需求,说是之前直接下载的PDF文件或者是Excel文件,现在不能直接下载,需要实现在线预览功能。

前端人员拿到这个需求后,去看了一下以前的代码,以前调用的下载接口和PDF文件预览接口都是直接将文件成二进制

流的形式,然后响应到前端。有的接口即使是动态生成PDF文件或者是Excel文件都是同样的操作,也是将动态生成的对

象的二进制流写入到响应对象中。前端人员遇到的问题是,如果直接将二进制流返回给前端,前端调用的时候,会直接

载而不能做其他处理。然后找我协商,看看后端人员有没有好的解决办法,我去百度里面查找,找到一个靠谱的方法,

大致意思就是将文件转为Base64格式的字符串数据,然后返回给前端,前端在去做响应的处理。

解决方案

确定方案后,然后我继续去百度里面查找如何将文件转为Base64格式的数据,找到一个可行的方法,网址如下:

https://blog.csdn.net/dbeautifullife/article/details/77650713

使用里面的方法写成了一个工具类,然后在根据业务的需要,添加了动态生成PDF文件和动态生成Excel

文件的方法,很好的解决了文件转换为Base64的方式。

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.context.annotation.Scope;
import sun.misc.BASE64Encoder;

import java.io.*;

/**
* @Description: 文件转 base64 工具类
* @ClassName: ToBase64Utils
* @author: dengchao
* @date: 2020/11/24 9:27
*/

@Slf4j
@Scope(value = "singleton")//单例
public class ToBase64Utils {

//私有化构造方法
private ToBase64Utils(){}

/* @Description: ava 自带的转换base64对象
* @author: dengchao
* @date: 2020-10-24 10:10
*/
private final static BASE64Encoder encoder = new BASE64Encoder();

/* @Description: 读取实体文件转 Base64
* @author: dengchao
* @date: 2020/11/24 9:29
* @param: file 文件对象
* @return: String 字符串
*/
public static String PDFToBase64(File file) {
if(file == null || !file.exists()){
throw new BaseException(MessageConstant.A000001, "传入的file对象为null或者文件不存在");
}

if(file.isDirectory()){
throw new BaseException(MessageConstant.A000001, "传入的file对象是一个路径,不是具体的文件");
}

ToBase64Utils.log.error("PDFToBase64-开始读取文件!");

try ( FileInputStream fin = new FileInputStream(file);
BufferedInputStream bin = new BufferedInputStream(fin);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedOutputStream bout = new BufferedOutputStream(baos);
){
byte[] buffer = new byte[1024];
int len = bin.read(buffer);
while(len != -1){
bout.write(buffer, 0, len);
len = bin.read(buffer);
}
//刷新此输出流并强制写出所有缓冲的输出字节
bout.flush();
return ToBase64Utils.byteArrayToBase64(baos);

} catch (FileNotFoundException e) {
ToBase64Utils.log.error("PDFToBase64-文件未找到!");
e.printStackTrace();
} catch (IOException e) {
ToBase64Utils.log.error("PDFToBase64-读取文件异常!");
e.printStackTrace();
}

return "";
}

/* @Description: 动态生成 Excel对象 转 Base64
* @author: dengchao
* @date: 2020/11/24 9:37
* @param: No such property: code for class: Script1
* @return:
*/
public static String workToBase64(Workbook workbook){
if(workbook == null){
throw new BaseException(MessageConstant.A000001, "传入Excel文件对象错误");
}

String excelBase64 = "";
try(ByteArrayOutputStream bos = new ByteArrayOutputStream()){
workbook.write(bos);
bos.flush();
excelBase64 = ToBase64Utils.byteArrayToBase64(bos);
}catch(Exception e){
excelBase64 = "";
ToBase64Utils.log.error("EXCEL文件转Base64错误!", e);
}

return excelBase64;
}

/* @Description: 字节输出流转 Base64
* @author: dengchao
* @date: 2020/11/24 9:48
* @param: No such property: code for class: Script1
* @return:
*/
public static String byteArrayToBase64(ByteArrayOutputStream bos){
if(bos == null){
throw new BaseException(MessageConstant.A000001, "传入的字节输入流对象错误");
}else{
byte[] byteArray = bos.toByteArray();
String resultString = ToBase64Utils.encoder.encodeBuffer(byteArray).trim();
return resultString;
}
}
}
核心原理就是将二进制的输出流转换为Base64字符串即可。

实际操作

工具类写好之后,立马和前端人员进行调试,测试通过,能够正常返回Base64的字符串,并且前端人员拿到数据后,可以进一步做其他操作。

前端人员的代码能看懂一大半,使用的VUE组件。大致意思就是引用VUE组件生成一个excel文件对象,然后在动态的拼接数据,最后显示

在页面中。

const workbook = await XLSX.read(res.responseBody, { type: 'base64', cellDates: true })
workbook.SheetNames.map(async item => {
if (item) {
const title = item
let html = await XLSX.utils.sheet_to_html(workbook.Sheets[item]).match(/<table>.*<\/table>/)[0]
const totalTr = html.match(/<\/tr>/g).length
const totalEmptyTd = html.match(/<td><\/td><\/tr>/g).length
// 如果每行结尾都是空 td,则过滤掉
if (totalTr === totalEmptyTd) {
html = html.replace(/<td><\/td><\/tr>/g, '</tr>')
}
this.xlsxHtml.push({title, html})
}
})

最终完成这个功能,PDF也是同样的处理方式。对于一般人来说,这完全能够满足需求,实现在线预览的功能,而且效果也很好。
可是对于专业人士来说,这种操作方式还是存在问题的,只要拿到文件的Base64的字符串数据,就可以拿到整个文件的所有数
据。所以对于安全要求比较严格的业务来说,这个是不达标的。不过对于我们来说,已经满足要求了。

PDF/Excel文件预览功能完整实现-java版本的更多相关文章

  1. 利用 ICEpdf 快速实现 pdf 文件预览功能

    之前工作中,需要实现一个在线预览pdf的功能,一开始用的的 jQuery-media 插件来实现的,后来感觉有点慢,就继续寻找更好的替代品,直到遇见了 ICE pdf... ICEpdf (官网:ht ...

  2. PLSQL导入Excel文件预览不到数据行问题

    今天,从Excel导入Oracle一些数据,在导入的过程中,遇到一个问题,Excel里面有好几万条数据,但是通过PLSQL导入向导导入Excel文件之后,在PLSQL里却预览不到数据行,只能看见标题行 ...

  3. vue使用kkfileview文件预览功能

    1.环境要求: java 1.8+ 2.部署运行: 本机以及虚拟机上运行: 1.从https://gitee.com/kekingcn/file-online-preview/releases地址下载 ...

  4. java项目中Excel文件预览

    package com.linkonworks.df.busi.utils; import java.io.File; import java.io.FileInputStream; import j ...

  5. win10打文件预览功能

  6. JS通过使用PDFJS实现基于文件流的预览功能

    需求: 使用JS实现PDF文件预览功能 备选方案: 使用ViewerJS,官网  http://viewerjs.org/ 使用PDFJS,官网  https://mozilla.github.io/ ...

  7. COS控制台进阶 - 文件预览和在线编辑

    导语 | COS控制台新上线了文件预览功能,用户可在控制台内直接预览.编辑文件内容. 前不久,微软发布了 vscode for web 的公告,是基于web的在线代码编辑器,无需下载安装可以直接在we ...

  8. java实现office文件预览

    不知觉就过了这个久了,继上篇java实现文件上传下载后,今天给大家分享一篇java实现的对office文件预览功能. 相信大家在平常的项目中会遇到需要对文件实现预览功能,这里不用下载节省很多事.大家请 ...

  9. 关于pc端 app端pdf,word xls等文件预览的功能

    第一种用H5标签<iframe>标签实现 返回的文件类型,文件流,文件流返回必须在设置 contentType对应的Mime Type, 返回文件的物理位置. 已经实测可以支持的文件类型 ...

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

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

随机推荐

  1. 小白学k8s(1)二进制部署k8s

    二进制部署k8s 前言 准备工作 关闭防火墙 关闭 swap 分区 关闭 SELinux 更新系统时间 秘钥免密码 设置主机名称 服务器角色 安装etcd 创建证书 生成证书 部署Etcd 在Node ...

  2. 领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统

    领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统 本项目主要实现了疾病自诊和医生推荐两个功能并构建了医生服务指标评价体系.疾病自诊主要通 ...

  3. 强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战

    强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法.双延迟深度确定性策略梯度TD3算法详解项目实战 1.定义算法 1.1 定义模型 !pip uninstall -y par ...

  4. 深度学习应用篇-自然语言处理[10]:N-Gram、SimCSE介绍,更多技术:数据增强、智能标注、多分类算法、文本信息抽取、多模态信息抽取、模型压缩算法等

    深度学习应用篇-自然语言处理[10]:N-Gram.SimCSE介绍,更多技术:数据增强.智能标注.多分类算法.文本信息抽取.多模态信息抽取.模型压缩算法等 1.N-Gram N-Gram是一种基于统 ...

  5. 从嘉手札<2023-12-15>

    荒原  朔方 2023.12.15 人生实属是很愁的时间 愁到听不见一点雪花飘落的声音 愁到连随便写点文章都算得上拼尽全力 萧瑟的北风吹散了为数不多的倔强 漫天的雪花飞舞 埋葬的是那么多年走过的春秋 ...

  6. 该换Linux版本了!

    提起开发,程序员们更青睐于不同版本的Linux操作系统而不是Windows.为什么?因为Linux操作起来更安全.快捷,最重要的是,它的发行版本众多.你可以根据需要挑选最适合的那一款.那么,问题来了, ...

  7. AutoGPT是什么?超简单安装使用教程

    1.AutoGPT 最近几天当红炸子鸡的是AutoGPT,不得不说AI发展真快啊,几天出来一个新东西,都跟不上时代的脚步了. AutoGPT是一个开源的应用程序,展示了GPT-4语言模型的能力.这个程 ...

  8. linux-Shell将命令行终端输出结果写入保存到文件中

    (一)将输出与错误写到同一个文件(1)方法1 #!bin/bashjava -jar hbase-example.jar 2>&1 | tee hbase_log.txt 说明:0,1, ...

  9. axios.delete传参,400错误

    我在使用axios.delete进行传参的时候,发现会报400错误 后端代码(C#) 前端代码 这样的参数请求会报400错误 后端就一个参数,前端发一个id为什么接受不到呢? 在网上找了半天,终于明白 ...

  10. NC50614 取石子游戏 1

    题目链接 题目 题目描述 有一种有趣的游戏,玩法如下: 玩家:2人: 道具:N颗石子: 规则: 游戏双方轮流取石子:每人每次取走若干颗石子(最少取1颗,最多取K颗):石子取光,则游戏结束:最后取石子的 ...