在线预览PDF文件、图片,并且预览地址不显示文件或图片的真实路径。

news2024/12/25 23:54:37

实现在线预览PDF文件、图片,并且预览地址不显示文件或图片的真实路径。

    • 1、vue使用blob流在线预览PDF、图片(包括jpg、png等格式)。
      • 1、按钮的方法:
      • 2、方法详细:(此方法可以在发起请求时携带token,适合JWT认证)
      • 3、script中定义一些指定格式使用blob转换的文件类型:
      • 4、export default 中data ( ) 设置文件类型数组包含何种文件格式:
    • 2、springboot后端接口返回文件流。(文件类型放在请求头,以便前端获取处理)
      • 1、方法1:
      • 2、方法2:
    • 3、前端最终的展示效果:

1、vue使用blob流在线预览PDF、图片(包括jpg、png等格式)。

想要实现在线预览PDF文件、图片,并且预览地址不显示文件或图片的真实路径,可使用blob流。

vue前端关键代码:

1、按钮的方法:

<el-button color="#00ffcc" size="small" @click="invoicePreview(props.row.oid)" v-if="props.row.ifInvoice == 1"><el-icon><Tickets /></el-icon>查看发票</el-button>

2、方法详细:(此方法可以在发起请求时携带token,适合JWT认证)

// 预览发票
invoicePreview(oid){
                console.log(oid)
                this.$http({
                    url: 'invoicePreview',
                    method: 'get',
                    responseType: 'arraybuffer',
                    params: {
                        oid: oid
                    }
                }).then(res => {
                    console.log(res);
                    console.log(res.headers.type);

                    let fileType = res.headers.type;
                    let currType = '';

                    const binaryData = [];
                    if(fileType){
                        currType = fileTypeMap[fileType]
                        if(this.imageType.includes(fileType)){
                            // 识别为图片
                            binaryData.push(res.data);
                            //获取blob链接
                            this.URL = window.URL.createObjectURL(new Blob(binaryData, {type: currType}));
                            window.open(this.URL);
                        }else if(this.wordType.includes(fileType)){
                            // 识别为PDF
                            binaryData.push(res.data);
                            //获取blob链接
                            this.URL = window.URL.createObjectURL(new Blob(binaryData, {type: currType}));
                            window.open(this.URL);
                        }else {
                            this.$message.error('不支持此文件预览')
                        }
                    }else {
                        this.$message.error('不支持此文件预览')
                    }
                })
            }

3、script中定义一些指定格式使用blob转换的文件类型:

const fileTypeMap = {
        "pdf": "application/pdf",
        "png": "image/png",
        "gif": "image/gif",
        "jpeg": "image/jpeg",
        "jpg": "image/jpeg",
        "txt": "txt/plain",
    }

4、export default 中data ( ) 设置文件类型数组包含何种文件格式:

作用是与blob转换的文件类型进行匹配。

data () {
            return {
                wordType:['pdf', 'txt'],
                imageType: ['png', 'gif', 'jpeg', 'jpg']
            }

在这里插入图片描述

2、springboot后端接口返回文件流。(文件类型放在请求头,以便前端获取处理)

后端关键代码:(二选一即可)

1、方法1:

        File file = new File(filePath);

        //获取文件后缀
        String suffix = file.getName().substring(file.getName().lastIndexOf(".") + 1, file.getName().length());

        //使用流的形式下载文件--方法2
        try (
                InputStream is = new FileInputStream(filePath);
                OutputStream os = response.getOutputStream()
        ) {
            byte[] bytes = StreamUtils.copyToByteArray(is);
            response.reset();
            response.addHeader("Content-Disposition", "inline;filename=" + new String(filePath.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
            response.addHeader("Content-Length", "" + bytes.length);
            // 文件类型放在请求头,以便前端获取处理
            response.addHeader("type", suffix);
            os.write(bytes);
            os.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }

2、方法2:

        File file = new File(filePath);

        //获取文件后缀
        String suffix = file.getName().substring(file.getName().lastIndexOf(".") + 1, file.getName().length());

        try {
            response.addHeader("Content-Disposition", "inline; filename*=UTF-8''" + URLEncoder.encode(file.getName(), "UTF-8"));
            // 文件类型放在请求头,以便前端获取处理
            response.addHeader("type", suffix);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        ServletOutputStream os = null;
        try{
            os = response.getOutputStream();
            os.write(FileUtils.readFileToByteArray(file));
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(os != null){
                // 此处的close为一个私有方法
                close(os);
            }
        }
private void close(Closeable closeable){
        if(closeable != null){
            try{
                closeable.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

3、前端最终的展示效果:

在这里插入图片描述
在这里插入图片描述
至此完结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Data2Vec:视觉、语音和语言的语境化目标表征的高效自监督学习

Efficient Self-supervised Learning with Contextualized Target Representations for Vision, Speech and Language &#xff08;视觉、语音和语言的语境化目标表征的高效自监督学习&#xff09; 论文&#xff1a;efficient-self-supervised-learning-with-contextualized-t…

【Hello Linux】Linux工具介绍 (gcc/g++ gdb)

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的常用工具gcc/g 以及gbd Linux工具介绍gcc / ggcc / g的作用为什么语言要经过这四步才能变为可执行指令gcc / g语法预处理编…

机器学习强基计划8-1:图解主成分分析PCA算法(附Python实现)

目录0 写在前面1 为什么要降维&#xff1f;2 主成分分析原理3 PCA与SVD的联系4 Python实现0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器学习模型&#xf…

MATLAB | 情人节来绘制更立体的玫瑰花吧

又是一年情人节&#xff0c;今年带来一款更有立体感的玫瑰&#xff1a; 曲面的函数表达式来自: http://www.bugman123.com/Math/index.html 这个网站&#xff0c;上面还有很多其他帅气的玩意。 基础绘制 xlinspace(0,1,300); thetalinspace(-2*pi,15*pi,300); [x,theta]meshg…

【历史上的今天】2 月 14 日:第一台通用计算机面世;IBM 成立;Julia 公开发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 2 月 14 日&#xff0c;在 1819 年的今天&#xff0c;打字机和第一台 QWERTY 布局键盘的发明者克里斯托弗肖尔斯&#xff08;Christopher Sholes&#xff09;出…

API文档自动生成工具

一、参考资料 从Python源码注释&#xff0c;自动生成API文档 二、问题引入 不管是开源还是闭源&#xff0c;要让所有人都能读懂你的代码这太难了&#xff0c;所以文档是很重要的。大部分情况&#xff0c;我们不希望维护一份代码再加上一份文档&#xff0c;这样做很容易造成文…

Springboot扩展点之InitializingBean

前言InitializingBean这个扩展点&#xff0c;其实在Springboot扩展点之BeanPostProcessor中已经简单有所涉及&#xff0c;而这篇文章的将重点分析其功能特性、实现方式和工作原理。功能特性1、Spring中提供了InitializingBean接口&#xff0c;帮助用户实现一些自定义的初始化操…

为什么学了模数电还是看不懂较复杂的电路图

看懂电路并不难。 (1) 首先要摆正心态&#xff0c;不要看到错综复杂的电路图就一脸懵逼&#xff0c;不知所错。你要明白&#xff0c;再复杂的电路也是由一个个的基本电路拼装出来的。 (2) 基础知识当然是少不了的&#xff0c;常用的基本电路结构搞搞清楚。 (3) 分析电路之前先要…

Unity通俗易懂的讲解PPU(Pixel Per Unit)与Camera Size

目录 前言 Unity的一个单位 Camera Size Pixel Per Unit的具体含义 前言 unity 2d中的sprite &#xff0c;具有一个参数&#xff1a;Pixel Per Unit 初学者往往不知道这个代表什么意思&#xff0c;如何理解&#xff0c;怎么设置&#xff0c;这个在unity的美术素材的使用也…

DynamicPDF HTML Converter for .NET 1.9 Crack

.NET HTML 到 PDF 转换库,快速将 HTML 转换为 PDF,转换为文件或字节数组,多线程性能 DynamicPDF Converter for .NET is a .NET API that allows developers to dynamically convert many common file formats to PDF documents in real-time. Converter supports converting …

使用Cifar10训练DenseNet121

DenseNet默认就是DenseNet-BC, 相对于resnet&#xff0c;densenet权重参数更少&#xff0c;鲁棒性更强. &#xff10;、下载数据集&#xff1a;Cifar-10在同级文件data下 预训练权重&#xff1a; densenet121: https://download.pytorch.org/models/densenet121-a639ec97.pth…

C++ 之基本数据类型(整型、布尔型及字符型)

文章目录参考描述数据类型整形有符号无符号规则sizeof 运算符进制cout 的自动转换&#xff08;进制&#xff09;后缀验证溢出主动权溢出布尔型变量判断结果字符型ASCII细节范围参考 项目描述菜鸟教程数据类型搜索引擎GoogleC Primer Plus &#xff08;第六版&#xff09;中文版…

深度学习目标检测_YOLOV4超详细解读

文章目录一. 前言yolov4的创新点2.1 输入端的创新2.1.1数据增强2.1.2自对抗训练&#xff08;SAT&#xff09;2.2BackBone创新Dropblock标签平滑损失函数IOU LossGIOU LossDIOU LossCIOU Loss一. 前言 作者AlexeyAB大神&#xff01; YOLOv4 拥有43.5%mAP65FPS &#xff0c;达到…

C语言(利用函数将字符串转换为数字和数子转换字符串)

目录 1.atoi(字符串转换为int类型) 2.atof(字符串转换为float类型) 3.atol(字符串转换为long类型) 4.strtol(字符串转换为long类型,但可以选择转换的进制&#xff0c;以及标记结束字符地址) 5.strtod(字符串转换为double类型,可以标记结束字符地址) 6.整数和浮点数转换为…

项目进度经常超时怎么办?项目经理如何有效管理项

当项目延期&#xff0c;我们要先找根因&#xff0c;再根据根因制定具体针对性措施。如果是故障&#xff0c;第一时间是以修复问题为主&#xff0c;然后去找原因&#xff0c;最终给出对应的措施。 对于项目进度&#xff0c;那首先要去了解延期的原因&#xff0c;是计划制定的不…

vite 项目切换不同依赖项的分支,运行加载缓慢问题的解决方案(Pre-bundling dependencies)

前言 当我们在首次使用 yarn dev 命令启动 vite 时&#xff0c;或者 切换分支&#xff0c;依赖项发生变化时 会发现项目启动时相当的慢&#xff0c;大概要十几分钟&#xff0c;而且控制台终端打印了如下信息&#xff1a; Pre-bundling dependencies: this will be run only …

vivo官网App模块化开发方案-ModularDevTool

作者&#xff1a;vivo 互联网客户端团队- Wang Zhenyu 本文主要讲述了Android客户端模块化开发的痛点及解决方案&#xff0c;详细讲解了方案的实现思路和具体实现方法。 说明&#xff1a;本工具基于vivo互联网客户端团队内部开源的编译管理工具开发。 一、背景 现在客户端的业…

【Jqgrid分页勾选保存】三步实现表格分页勾选(取消勾选)保存(附源码)

目录1、创建临时存储数组&#xff0c;初始化赋值2、单行选中与取消&#xff0c;调整数组3、全选与取消全选&#xff0c;调整数组4、输出数组保存5、片尾彩蛋【写在前面】表格可以说是在我们的web页面中是最常见的&#xff0c;之前我们介绍过layui表格翻页勾选的实现过程&#x…

到2030年,边缘计算潜在市场将增长至4450亿美元!

国际电信咨询公司STL Partners近日出了一份边缘计算关键数据统计&#xff0c;重点介绍了九项边缘计算统计数据&#xff0c;边小缘着手翻译了一下这些数据&#xff0c;这些数据预测显示了边缘计算市场的增长潜力&#xff0c;以及边缘部署数量最多的垂直行业和地区。1.到2030年&a…

java Spring aop入门准备工作

首先 Spring 框架一般都是基于 Aspect]实现 AOP 操作 然后就会带出问题 什么是 Aspect 首先 Aspect并不属于Spring 他是一个单独的AOP框架 离开Spring他也能单独运行 但在Spring开发中 我们常用他来配合Spring完成AOP操作 所以说 我们是要 基于Aspect去配合Spring完成AOP操作…