基于若依前后端分离版(Springboot+Vue)的文件预览

article/2025/9/5 21:53:20

主要介绍两种方式实现文件预览的方式,一种是通过前端插件匹配不同的文件,另一种就是使用已经完善的文件预览系统。我更推荐使用第二种方式,因为这样会少去很多工作量。本文主要介绍第一种方式,第二种方式会出现在另外一篇文章中。

本文是基于若依前后端分离版本实现文件预览功能。若依官网链接。

通过前端插件匹配文件预览:有两个思路,一个是传blob流,然后将流转成对应的文件格式,再进行预览。另一个是通过后端将文件地址映射出来,然后通过浏览器进行访问。两种方式各有优缺点,blob流方式在进行本地测试阶段,没有发现任何问题,但是当部署到服务器,就会出现文件流传输速度问题,如果是内网使用,速度还可以接收,但是外网使用,预览速度根本无法接收。blob流方式预览就相当于下载完文件后,再进行预览,所以速度很慢。浏览器打开方式只支持浏览器支持预览的文件,很多文件格式不支持。总之,这两种文件预览方式的缺陷还是很大的,如果文件预览支持的格式较少,文件都不是很大,适用于个人学习,只使用电脑端使用而不使用手机端时,可以进行使用。

1.文件操作的时间比简单调用数据库的时间长很多。为了避免前端访问后端接口因为超市而报错,将超时时间设置长一点。将ruoyi-ui/src/utils/request.js文件下的timeout设置为6000000,可以根据自己的使用情况进行设置。

// 创建axios实例
const service = axios.create({// axios中请求配置有baseURL选项,表示请求URL公共部分baseURL: process.env.VUE_APP_BASE_API,// 超时timeout: 6000000
})

2.文件预览之前,先要进行文件上传。文件上传的内容可以看我写的《SpringBoot实现文件上传和下载》。后端在ruoyi-admin/src/main/resources/application.yml文件最后面添加文件路径配置,文件地址可以自行设置。

prop:filePath: d:/csdn/onlineFile/

3.后端返回文件流的接口,其中filePath是在controller类中通过@Value导入。

    @Value("${prop.filePath}")private String filePath;
/*** 根据文件名下载文件** @param fileName 文件名,是由文件id+文件扩展名(extName)组成* @return 文件信息* @throws IOException*/
@GetMapping("/download")
public ResponseEntity<InputStreamResource> download(String fileName) throws IOException {String path = filePath + fileName;FileSystemResource file = new FileSystemResource(path);// 设置响应头HttpHeaders headers = new HttpHeaders();headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getFilename()));return ResponseEntity.ok().headers(headers).contentLength(file.contentLength()).contentType(MediaType.parseMediaType("application/octet-stream")).body(new InputStreamResource(file.getInputStream()));
}

4.在ruoyi-ui/src/api下面创建文件夹file,在此文件夹下创建file.js文件,用于访问与文件有关的后端接口。

import request from "@/utils/request";
let fileUrl = '后端controller的RequestMapping的值'
export function getPrevieweFile(fileName) {return request({url: fileUrl + '/download',method: 'get',params: {fileName},responseType: 'blob'})
}

注意:

1.url为后端controller的RequestMapping的值+RequestMapping的值。

2.返回类型必须设置为blob。

5.blob值的获取方式。

getPrevieweFile(fileName).then(res => {let blob = new Blob([res]);//通过switch,调用不同类型文件的处理函数switch (file.extName) {case '.txt':this.previewData.type = 'txt';this.handleTxtFilePreview(blob);break;case '.png':this.previewData.type = 'image';this.handleImageFilePreview(blob);break;case '.jpg':this.previewData.type = 'image';this.handleImageFilePreview(blob);break;case '.xls':this.previewData.type = 'excel';this.handleExcelFilePreview(blob);break;case '.xlsx':this.previewData.type = 'excel';this.handleExcelFilePreview(blob);break;case '.docx':this.previewData.type = 'word';this.handleWrodFilePreview(blob);break;case '.pdf':this.previewData.type = 'pdf';this.handlePdfFilePreview(blob);break;}
})

6.blob流方式的.txt文件

handleTxtFilePreview(blob) {let reader = new FileReader();reader.readAsArrayBuffer(blob);reader.onload = (evt) => {let ints = new Uint8Array(evt.target.result); //要使用读取的内容,所以将读取内容转化成Uint8Arrayints = ints.slice(0, blob.size); //截取一段读取的内容let text = new TextDecoder('utf-8').decode(ints); //二进制缓存区内容转化成中文(即也就是读取到的内容)console.log(text);};
}

提示:text中的内容就是转换出来的内容,具体怎么显示可根据实际情况而定。

结果:

控制台打印

显示

7.blob流方式的.png和.jpg文件

handleImageFilePreview(blob) {let url = URL.createObjectURL(blob);
}

提示:url就是图片地址,可以通过img标签,然后将src的值传入url,就可以查看图片。

结果:

8.blob流方式的.xls和.xlsx文件

handleExcelFilePreview(blob) {let reader = new FileReader();reader.readAsArrayBuffer(blob);reader.onload = (evt) => {let ints = new Uint8Array(evt.target.result); //要使用读取的内容,所以将读取内容转化成Uint8Arrayints = ints.slice(0, blob.size);let workBook = xlsx.read(ints, { type: "array" });let sheetNames = workBook.SheetNames;let sheetName = sheetNames[0];let workSheet = workBook.Sheets[sheetName];//获取Excle内容,并将空内容用空值保存let excelTable = xlsx.utils.sheet_to_json(workSheet, { defval: '' });// 获取Excel头部let tableThead = Array.from(Object.keys(excelTable[0])).map((item) => {return item});this.previewData.content = {};this.previewData.content.tableContent = excelTable;this.previewData.content.tableThead = tableThead;this.previewDialogOpen = true;}}

注意:

1.vue需要安装插件xlsx。安装方式:npm install xlsx

2.引入方式:import * as xlsx from "xlsx"

3.当前只考虑excel只有一个sheet的情况,如果excel有多个,可以递归sheetNames,然后读出所有数据,再进行显示。sheetNames[0]代表第一个sheet,以此类推。

结果:

9.blob流方式的.docx文件

handleWrodFilePreview(blob) {this.previewDialogOpen = true;let docx = require("docx-preview");this.$nextTick(() => {docx.renderAsync(blob, this.$refs.word);})}
<div ref="word"></div>

注意:

1.vue需要安装插件docx-preview。安装方式:npm install docx-preview

2.只能预览.docx文件,.doc文件无法预览。

结果:

10.blob流方式的.pdf文件

handlePdfFilePreview(blob) {this.previewData.src = URL.createObjectURL(blob);let loadingTask = pdf.createLoadingTask(this.previewData.src);loadingTask.promise.then((pdf) => {this.previewData.pdfPages = pdf.numPages;})
}
<pdf v-for="pdfPage in previewData.pdfPages" :key="pdfPage" :page="pdfPage" :src="previewData.src"width="100%">
</pdf>

注意:

1.vue需要安装插件vue-pdf。安装方式:npm install vue-pdf

2.引入方式:import pdf from "vue-pdf"

3.components注入方式:

4.如果pdf文件过大,会导致浏览器崩溃。

components: {pdf
}

结果:

11.进行下面文件预览之前,先将文件地址映射出来。在ruoyi-admin/src/main/com.ruoyi包下,创建包config,然后在config包下创建MyWebMvcConfig配置类,将文件地址映射出来。由于使用若依系统,为了测试方便,将映射地址权限设置为任何情况下都可以访问。具体方法,打开ruoyi-framework/src/main/java/com.ruoyi.framework/config/SecurityConfig.class,在静态资源下面添加文件映射地址的访问权限为任何人可以访问。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {@Value("${prop.filePath}")private String filePath;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 匹配到resourceHandler,将URL映射至location,也就是本地文件夹registry.addResourceHandler("/data/webFiles/**").addResourceLocations("file:" + filePath);}
}

.antMatchers("/data/webFiles/**").permitAll()

注意:

1.文件预览方式是后端ip(localhost) + : + 后端端口号(8111) + 文件映射地址(/data/webFile/) + 文件名(48576e3f96d5433bbd35f7cf16b952a6.pdf)。使用默认方式的地址为http://localhost:8111/data/webFiles/48576e3f96d5433bbd35f7cf16b952a6.pdf

2.以上面文件映射地址为例,/data/webFile/的作用相当于文件路径d:/csdn/onlineFile/。如果在d:/csdn/onlineFile的文件夹下,有个test文件夹对应文件路径为d:/csdn/onlineFile/test/,那么访问此文件夹下的文件,地址访问路径就会变成http://localhost:8111/data/webFiles/test/ + 文件名。

3.此种方式预览文件,只能预览浏览器能够支持的文件格式。

结果:

文章开始提到的另外一种方式就是通过kkfileview实现文件预览,这种方式能够快速搭建文件系统,支持多种格式的预览功能,预览速度快,可以作为一个独立的系统使用,不影响主系统架构,不受浏览器、电脑端或手机端的影响。

后面文章会有专门讲解kkfileview如何配置和打包使用。

文章链接:

支持外网访问的kkfileview文件预览系统的详细使用过程

我也是个新手,上面很多内容不够完善,甚至有些是错误的,请大家见谅。这是我在学习过程中做的笔记,感觉对大家可能有所帮助才发出来的,大家可以选择性查看。我也是在不断学习,不断完善自己。如果我在学习过程中,感觉对大家有用的部分,也会再次分享给大家的。谢谢!


http://chatgpt.dhexx.cn/article/Z0uC8kxT.shtml

相关文章

Java中如何实现文件预览的功能

文件预览方法总结 前言一、kkfileview 文件在线预览二、officetohtml纯前端的方式三、JODConverter四、Aspose总结 前言 日常开发中常见的文件格式有pdf&#xff0c;word&#xff0c;Excel&#xff0c;PPT&#xff0c;Html&#xff0c;txt&#xff0c;图片等。pdf&#xff0c;…

前端技术实现文件预览(word、excel、pdf、ppt、mp4、图片、文本)

前言 因为业务需要&#xff0c;很多文件需要在前端实现预览&#xff0c;今天就来了解一下吧。 Demo地址[1]&#xff1a;https://zhuye1993.github.io/file-view/dist/index.html 实现方案 找了网上的实现方案&#xff0c;效果看起来不错&#xff0c;放在下面的表格里&#xff0…

localStorage怎样存取数据 怎样清除localStorage存储的数据

localStorage很多时候用来存储数据非常好&#xff0c;方便在页面中使用某些数据的时候调用 首先&#xff0c;通过setItem(key,value)即可存储数据 然后用getItem(key)的方式即可取得数据 可以看到&#xff0c;设置之后在浏览器的localStorage中看到存储的数据 使用localStoage…

Android App清除数据的方案

前言 最近MIUI13上出了个未经应用商店安装&#xff0c;算是未知来源。AndroidID&#xff0c;通知&#xff0c;网络权限没授权则默认关闭。 安装app时允许虚拟身份ID&#xff1a; 允许允许虚拟身份ID前获取一次AndroidId&#xff1a; attachBaseContext获取AndroidId, 此时还没…

kafka清理数据

由于项目原因&#xff0c;最近经常碰到Kafka消息队列拥堵的情况。碰到这种情况为了不影响在线系统的正常使用&#xff0c;需要大家手动的清理Kafka Log。但是清理Kafka Log又不能单纯的去删除中间环节产生的日志&#xff0c;中间关联的很多东西需要手动同时去清理&#xff0c;否…

Kafka数据清理

目录 kafka数据清理日志删除&#xff08;Log Deletion&#xff09;1. 基于时间的保留策略2. 基于日志大小的保留策略3. 基于日志起始偏移量保留策略 日志压缩&#xff08;Log Compaction&#xff09; 原文地址&#xff1a;https://program-park.github.io/2021/09/18/kafka_11/…

mysql数据库要定期清除吗_数据库mysql定时清除数据

数据库mysql定时清除数据 数据库mysql定时清除数据 https://www.jiangweishan.com/article/2384238490809808.html 作者&#xff1a;andy0012019.11.22来源&#xff1a;Web前端之家浏览&#xff1a;2081评论:0 关键词&#xff1a;jsmysql 一个项目如果规划不合理&#xff0c;每…

SDN是什么,与传统分布式网络有什么区别

传统的的分布式网络 分布式网络也叫网状网络&#xff0c;它是由分布在不同地点的计算机系统互连而成&#xff0c;网中无中心节点。通信子网是封闭式结构&#xff0c;通信控制功能分布在各节点上。 分布式网络的特点是&#xff1a;可靠性高&#xff1b;网内节点共享资源容易&am…

软件定义网络(SDN)

SDN基本概述 参考文章&#xff1a;SDN基本概述、解读SDN的东西、南北向接口 传统网络数据控制与转发 传统网络是分布式控制的架构&#xff0c;每台设备都包含独立的控制平面&#xff0c;数据平面。 传统网络是分布式控制的架构&#xff1a; 这里的分布式控制指在传统IP网络…

sdn通俗介绍

拼客学院服务号 前言 SDN&#xff08;Software Defined Network&#xff09;即软件定义网络&#xff0c;是一种网络设计理念&#xff0c;或者一种推倒重来的设计思想。只要网络硬件可以集中式软件管理&#xff0c;可编程化&#xff0c;控制转发层面分开&#xff0c;则可以认为这…

SDN — Google B4 SDN WAN 网络架构

目录 文章目录 目录Google B4 SDN WAN 网络B4 网络架构物理设备层局部网络控制层全局控制层Google B4 SDN WAN 网络 Google 的 WAN 有 2 张网络(Two Backbones): B2(Internet-facing WAN,I-Scale Network):数据中心互联 Internet(POP)的网络,用于面向 Internet 用户…

SDN基础理解

1. 何为SDN 1) 为什么需要一个全新的网络架构&#xff0c;比如SDN&#xff1f; 在传统的架构中&#xff0c;交换机和路由器不得不在操作6000种分布式协议的控制下实施整个网络的智能。这就意味着&#xff0c;即使只有一个网元增加了一种新的协议&#xff0c;也需要所有其他网元…

SDN概述

SDN概述1 SDN是什么 ONRC是 SDN创始人斯坦福大学教授Nick McKeown和加州大学伯克利分校教授 Scott Shenker&#xff0c;以 Larry Peterson教授 共同创建的研究架构。ONRC对SDN的定义是&#xff1a;“SDN是一种逻辑集中控制的新网络架构&#xff0c;其关键属性包括&#xff1a…

SDN网络架构简述

SDN的特点之一就是控制平面与数据平面分离&#xff0c;其主张通过集中式的控制器平台实现网络的控制。在SDN架构中&#xff0c;控制平面是逻辑集中的&#xff0c;通过某种协议将控制信息下发至底层的数据平面去执行。所以&#xff0c;控制平面被称为SDN的大脑&#xff0c;指挥整…

什么是SDN

为什么要推出SDN&#xff1f; SDN的起源 • SDN ( Software Defined Networking &#xff09;即软件定义网络。是由斯坦福大学Clean Slate研究组提出的一种新型网络创新架构。 真核心理念通过将网络设备控制平面与数据平面分离&#xff0c;从而实现了网络控制平面的集中 控制&…

SDN概述,SDN是什么?

软件定义网络(Software Defined Network, SDN)在InfoWorld于2011年11月公布的将影响未来10年的十项新技术中排名第二。2012年7月&#xff0c;SDN代表厂商Nicira被 VMware以12.6亿美元收购&#xff0c;随后Google宣布成功在其全球10个IDC网络中部署SDN&#xff0c;这促使SDN引起…

SDN网络概述

SDN是一种存在逻辑上集中控制的新型网络结构&#xff0c;其主要特征是数据平面与控制平面分离。数据平面与控制平面之间通过标准的开放接口OpenFlow实现信息交互。 一、SDN的主要内容 SDN在数据平面、控制平面、应用平面的研究内容主要涉及以下方面&#xff1a; 1&#xff0…

SDN基本概念

文章目录 SDN基本概念SDN的概念与体系结构背景传统网络数据控制与转发传统网络结构体系传统网络缺点 SDN概述SDN网络体系架构SDN架构下的接口SDN基本原理OpenFlow的思想和功能OpenFLow网络交换模型 SDN价值网络业务快速创新简化网络网络设备白牌化业务自动化网络路径流量优化 传…

SDN技术概述

1.SDN架构定义 软件定义网络&#xff08;Software Defined Networking&#xff0c;SDN&#xff09;是一种数据平面与控制分离、软件可编程的新型网络体系架构&#xff0c;开放网络基金会&#xff08;Open Network Foundation&#xff0c;ONF&#xff09;作为目前SDN最重…

SDN基本概述

SDN的概念与体系结构 传统网络数据控制与转发&#xff1a; 传统网络是分布式控制的架构&#xff0c;每台设备都包含独立的控制平面&#xff0c;数据平面。 传统网络是分布式控制的架构&#xff1a; 这里的分布式控制指在传统IP网络中&#xff0c;用于协议计算的控制平面和报…