IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot+Vue+OpenOffice实现文档管理(文档上传、下载、在线预览) -> 正文阅读

[Java知识库]SpringBoot+Vue+OpenOffice实现文档管理(文档上传、下载、在线预览)

场景

SpringBoot集成OpenOffice实现doc文档转html:

SpringBoot集成OpenOffice实现doc文档转html_BADAO_LIUMANG_QIZHI的博客-CSDN博客

在上面初步使用了OpenOffice之后,怎样实现文档管理,文档上传、下载、在线预览等。

首先OpenOffice的下载安装与启动服务参照上文,不再复述。

注:

博客:
BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_CSDN博客
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

1、搭建SpringBoot+Vue前后端分离项目

若依前后端分离版本地搭建开发环境并运行项目的教程:

若依前后端分离版手把手教你本地搭建环境并运行项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客

2、设计表

数据库语句为

DROP TABLE IF EXISTS `bus_file_preview`;
CREATE TABLE `bus_file_preview`? (
? `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
? `fileName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '原文件名(上传前文件名)',
? `fileType` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件后缀(.xls;.xlsx;.ppt;.doc;.docx;.pptx)',
? `uploadPath` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上传后文件路径',
? `uploadFileName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上传后文件名',
? `pdfPath` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '转换pdf路径',
? `pdfName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '转换pdf文件名',
? `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
? `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '创建人',
? `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
? `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '更新人',
? `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '备注',
? `preview_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '预览URL',
? PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文件上传与预览' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

依照此表生成前后端代码,然后修改代码。

3、文件上传实现

前端按钮

??????? <el-form-item label="附件" prop="photoPath">
????????? <el-upload
??????????? :headers="headers"
??????????? :action="url"
??????????? :multiple="false"
??????????? :file-list="fileList"
??????????? :on-remove="fileRemove"
??????????? :on-success="uploadSuccess"
??????????? :on-error="uploadError"
??????????? :on-progress="uploadProgress"
??????????? :before-upload="beforeUpload"
??????????? :limit="1"
??????????? :on-exceed="beyond"
??????????? accept=".doc,.docx,.xls,.ppt,.xlsx,.pptx"
????????? >
??????????? <el-button size="small">
????????????? 上传
????????????? <i class="el-icon-upload el-icon--right"></i>
??????????? </el-button>
??????????? <div class="el-upload__tip" style="color: red" slot="tip">
????????????? 提示:仅允许导入“.doc、.docx、.xls、.ppt、.xlsx、.pptx”格式文件!
??????????? </div>
????????? </el-upload>
??????? </el-form-item>

调用的各方法

??? // 文件上传失败
??? uploadError(err) {
????? this.btnLoding = false;
????? this.$message.error(res.msg);
??? },
??? // 上传中
??? uploadProgress(e) {
????? this.btnLoding = true;
??? },
??? // 文件上传之前
??? beforeUpload(file) {
????? console.log(file, "上传之前");
????? const fileName = file.name;
????? const fileType = fileName.substring(fileName.lastIndexOf("."));
????? if (
??????? fileType === ".doc" ||
??????? fileType === ".docx" ||
??????? fileType === ".xls" ||
??????? fileType === ".ppt" ||
??????? fileType === ".pptx" ||
??????? fileType === ".xlsx"
????? ) {
??????? this.form.filename = file.name;
??????? // 不处理
????? } else {
??????? this.$message.error("请上传正确的文件类型,.doc,.docx,.xls,.ppt,.xlsx,.pptx,");
??????? return false;
????? }
??? },
??? // 文件上传成功
??? uploadSuccess(res, file, fileList) {
????? this.form.uploadpath = res.uploadpath;
????? this.btnLoding = false;
????? this.fileList = fileList;
????? this.$message(res.msg);
??? },
??? beyond(file, fileList) {
????? this.$message({
??????? message: "最多上传一个文件",
??????? type: "warning",
????? });
??? },
??? // 移除选择的文件
??? fileRemove(file, fileList) {
????? this.btnLoding = false;
????? this.reset();
????? this.fileList = [];
??? },

对应后台SpingBoot通用上传接口

这里做了修改,使其能返回磁盘路径

??? /**
???? * 通用上传请求返回磁盘路径
???? */
??? @PostMapping("/common/uploadWithAbsolutePath")
??? public AjaxResult uploadFileWithAbsolutePath(MultipartFile file) throws Exception
??? {
??????? try
??????? {
??????????? // 上传文件路径
??????????? String filePath = RuoYiConfig.getUploadPath();
??????????? // 上传并返回新文件名称
??????????? String fileName = FileUploadUtils.uploadWithAbsolutePath(filePath, file);
??????????? AjaxResult ajax = AjaxResult.success();
??????????? ajax.put("uploadpath", filePath+ File.separator+fileName);
??????????? return ajax;
??????? }
??????? catch (Exception e)
??????? {
??????????? return AjaxResult.error(e.getMessage());
??????? }
??? }

调用的方法uploadWithAbsolutePath实现

??? public static final String uploadWithAbsolutePath(String baseDir, MultipartFile file) throws IOException
??? {
??????? try
??????? {
??????????? return uploadWithAbsolutePath(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
??????? }
??????? catch (Exception e)
??????? {
??????????? throw new IOException(e.getMessage(), e);
??????? }
??? }

其中又调用的uploadWithAbsolutePath方法实现

??? public static final String uploadWithAbsolutePath(String baseDir, MultipartFile file, String[] allowedExtension)
??????????? throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
??????????? InvalidExtensionException
??? {
??????? int fileNamelength = file.getOriginalFilename().length();
??????? if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
??????? {
??????????? throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
??????? }
??????? assertAllowed(file, allowedExtension);
??????? String fileName = extractFilename(file);
??????? File desc = getAbsoluteFile(baseDir, fileName);
??????? file.transferTo(desc);
??????? return fileName;
??? }

其他的若依框架原来的方法。

上传效果

4、预览实现

上传之后的文件转换成pdf的实现,在提交按钮时调用后台就接口

??? /** 提交按钮 */
??? submitForm() {
????? this.$refs["form"].validate((valid) => {
??????? if (valid) {
????????? if (this.form.id != null) {
??????????? updatePreview(this.form).then((response) => {
????????????? this.msgSuccess("修改成功");
????????????? this.open = false;
????????????? this.fileList = [];
????????????? this.getList();
??????????? });
????????? } else {
??????????? addPreview(this.form).then((response) => {
????????????? this.msgSuccess("新增成功");
????????????? this.open = false;
????????????? this.fileList = [];
????????????? this.getList();
??????????? });
????????? }
??????? }
????? });
??? },

首先是新增接口

??? /**
???? * 新增preview
???? */

??? @Log(title = "preview", businessType = BusinessType.INSERT)
??? @PostMapping
??? public AjaxResult add(@RequestBody BusFilePreview busFilePreview) throws IOException{
??????? if (StringUtils.isNull(busFilePreview.getFilename())) {
??????????? AjaxResult.error("缺少文件名称");
??????? }
??????? if (StringUtils.isNull(busFilePreview.getUploadpath())) {
??????????? AjaxResult.error("缺少上传文件路径");
??????? }
??????? String substringAfter = StringUtils.substringAfter(busFilePreview.getUploadpath(), ".");
??????? String upName = StringUtils.substringAfterLast(busFilePreview.getUploadpath(), "/");
??????? busFilePreview.setUploadfilename(upName);
??????? busFilePreview.setFiletype(substringAfter); //类型
??????? if ("pdf".equals(substringAfter)){
??????????? FilePdfUtils.copyFile(busFilePreview.getUploadpath(), RuoYiConfig.getProfile());
??????????? String pdfName = StringUtils.substringAfterLast(busFilePreview.getUploadpath(), "/");
??????????? busFilePreview.setPdfpath(RuoYiConfig.getProfile()+ "/" + pdfName);
??????????? busFilePreview.setPdfname(pdfName);
??????????? return? toAjax(busFilePreviewService.insertBusFilePreview(busFilePreview));
??????? }

??????? File file = new File(busFilePreview.getUploadpath());
??????? FileInputStream fileInputStream = new FileInputStream(file);
??????? String htmFileName = FilePdfUtils.file2pdf(fileInputStream, substringAfter,RuoYiConfig.getProfile());
??????? String pdfPath = RuoYiConfig.getProfile()+ "/" + htmFileName;
??????? busFilePreview.setPdfpath(pdfPath);
??????? String pdfName = StringUtils.substringAfterLast(pdfPath, "/");
??????? busFilePreview.setPdfname(pdfName);
??????? String previewUrl = serverConfig.getUrl()+ Constants.RESOURCE_PREFIX+File.separator+htmFileName;
??????? busFilePreview.setPreviewUrl(previewUrl);
??????? return toAjax(busFilePreviewService.insertBusFilePreview(busFilePreview));
??? }

这里调用了工具类中FilePdfUtils的file2pdf方法,并且将转换后的pdf的路径拼接成静态资源映射后的路径返回给前端。

关于静态资源映射可以参考如下

SpringBoot中通过重写WebMvcConfigurer的方法配置静态资源映射实现图片上传后返回网络Url:

SpringBoot中通过重写WebMvcConfigurer的方法配置静态资源映射实现图片上传后返回网络Url_BADAO_LIUMANG_QIZHI的博客-CSDN博客

5、FilePdfUtils工具类实现

package com.ruoyi.common.utils.pdf;


import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;
import com.ruoyi.common.utils.StringUtils;

import java.io.*;
import java.net.ConnectException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FilePdfUtils {

??? /**
???? * 转换文件成pdf
???? *
???? * @param fromFileInputStream:
???? * @throws IOException
???? */
??? public static String file2pdf(InputStream fromFileInputStream, String type,String pdfPath) throws IOException {
??????? Date date = new Date();
??????? SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
??????? String timesuffix = sdf.format(date);
??????? String docFileName = null;
??????? String htmFileName = null;
??????? if("doc".equals(type)){
??????????? docFileName = "doc_" + timesuffix + ".doc";
??????????? htmFileName = "doc_" + timesuffix + ".pdf";
??????? }else if("docx".equals(type)){
??????????? docFileName = "docx_" + timesuffix + ".docx";
??????????? htmFileName = "docx_" + timesuffix + ".pdf";
??????? }else if("xls".equals(type)){
??????????? docFileName = "xls_" + timesuffix + ".xls";
??????????? htmFileName = "xls_" + timesuffix + ".pdf";
??????? }else if("ppt".equals(type)){
??????????? docFileName = "ppt_" + timesuffix + ".ppt";
??????????? htmFileName = "ppt_" + timesuffix + ".pdf";
??????? }else if("xlsx".equals(type)){
??????????? docFileName = "xlsx_" + timesuffix + ".xlsx";
??????????? htmFileName = "xlsx_" + timesuffix + ".pdf";
??????? }else if("pptx".equals(type)){
??????????? docFileName = "pptx_" + timesuffix + ".pptx";
??????????? htmFileName = "pptx_" + timesuffix + ".pdf";
??????? }else{
??????????? return null;
??????? }


??????? check_folder(pdfPath);

??????? File htmlOutputFile = new File(pdfPath + File.separatorChar + htmFileName);
??????? File docInputFile = new File(pdfPath + File.separatorChar + docFileName);
??????? if (htmlOutputFile.exists())
??????????? htmlOutputFile.delete();
??????? htmlOutputFile.createNewFile();
??????? if (docInputFile.exists())
??????????? docInputFile.delete();
??????? docInputFile.createNewFile();
??????? /**
???????? * 由fromFileInputStream构建输入文件
???????? */
??????? try {
??????????? OutputStream os = new FileOutputStream(docInputFile);
??????????? int bytesRead = 0;
??????????? byte[] buffer = new byte[1024 * 8];
??????????? while ((bytesRead = fromFileInputStream.read(buffer)) != -1) {
??????????????? os.write(buffer, 0, bytesRead);
??????????? }

??????????? os.close();
??????????? fromFileInputStream.close();
??????? } catch (IOException e) {
??????? }

??????? OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
??????? try {
??????????? connection.connect();
??????? } catch (ConnectException e) {
??????????? System.err.println("文件转换出错,请检查OpenOffice服务是否启动。");
??????? }

??????? DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
??????? converter.convert(docInputFile, htmlOutputFile);
??????? connection.disconnect();
??????? // 转换完之后删除word文件
??????? docInputFile.delete();
??????? System.out.println(htmFileName);
??????? return htmFileName;
??? }

??? public static void check_folder(String path) {
??????? File dir = new File(path);
??????? // 判断文件夹是否存在
??????? if (dir.isDirectory()) {
??????? } else {
??????????? dir.mkdirs();
??????? }
??? }

??? public static void copyFile(String oldPath, String newPath) throws IOException {
??????? File oldFile = new File(oldPath);//获取旧的文件File对象
??????? File file = new File(newPath + oldFile.separator + StringUtils.substringAfterLast(oldPath, "/"));? //获取新的文件File对象并生成文件
??????? FileInputStream in = new FileInputStream(oldFile);? //
??????? FileOutputStream out = new FileOutputStream(file);

??????? byte[] buffer=new byte[2097152];
??????? int readByte = 0;
??????? //读取旧文件的流写入新文件里
??????? while((readByte = in.read(buffer)) != -1){
??????????? out.write(buffer, 0, readByte);
??????? }

??????? in.close();
??????? out.close();
??? }

}

注意这里的连接openOffice的服务的端口要对应并且确保openOffice已经启动

?然后工具类FilePdfUtils是在common模块下,所以后台需要在此模块下pom文件中添加依赖

??????? <dependency>
??????????? <groupId>com.artofsolving</groupId>
??????????? <artifactId>jodconverter</artifactId>
??????????? <version>2.2.1</version>
??????? </dependency>

添加位置

注意这里的版本为2.2.1,Maven中央仓库中此为最高版本

这里在调用工具类转换文件时,如果文件类型为docx、pptx、xlsx时会报错提示

unknown document format for file ....docx

这是因为2.2.1的能转换doc ,但2.2.2才能转换docx,如果你用2.2.1的jar包,转换2.2.2的docx文档就会出错

除了不加载Maven中央仓库的2.1的依赖之外,还可以重写DocumentFormatRegistry接口的getFormatByFileExtension方法

注意包名一致

package com.artofsolving.jodconverter;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
?* @ClassName: online
?* @description: 重写 BasicDocumentFormatRegistry 文档格式
?* @Author: yandongfa
?* @Data: 2020-03-24 19:47
?* @Version: 1.0
?**/
public class BasicDocumentFormatRegistry implements DocumentFormatRegistry {

??? private List/* <DocumentFormat> */ documentFormats = new ArrayList();

??? public void addDocumentFormat(DocumentFormat documentFormat) {
??????? documentFormats.add(documentFormat);
??? }

??? protected List/* <DocumentFormat> */ getDocumentFormats() {
??????? return documentFormats;
??? }

??? /**
???? * @param extension
???? *??????????? the file extension
???? * @return the DocumentFormat for this extension, or null if the extension
???? *???????? is not mapped
???? */
??? public DocumentFormat getFormatByFileExtension(String extension) {
??????? if (extension == null) {
??????????? return null;
??????? }

??????? //new DefaultDocumentFormatRegistry();
??????? //将文件名后缀统一转化
??????? if (extension.indexOf("doc") >= 0) {
??????????? extension = "doc";
??????? }
??????? if (extension.indexOf("ppt") >= 0) {
??????????? extension = "ppt";
??????? }
??????? if (extension.indexOf("xls") >= 0) {
??????????? extension = "xls";
??????? }
??????? String lowerExtension = extension.toLowerCase();
??????? for (Iterator it = documentFormats.iterator(); it.hasNext();) {
??????????? DocumentFormat format = (DocumentFormat) it.next();
??????????? if (format.getFileExtension().equals(lowerExtension)) {
??????????????? return format;
??????????? }
??????? }
??????? return null;
??? }

??? public DocumentFormat getFormatByMimeType(String mimeType) {
??????? for (Iterator it = documentFormats.iterator(); it.hasNext();) {
??????????? DocumentFormat format = (DocumentFormat) it.next();
??????????? if (format.getMimeType().equals(mimeType)) {
??????????????? return format;
??????????? }
??????? }
??????? return null;
??? }
}

6、在线预览实现

????????? <el-button
??????????? size="mini"
??????????? type="text"
??????????? icon="el-icon-edit"
??????????? @click="handlePreview(scope.row)"
??????????? >预览</el-button
????????? >

调用js方法

??? // 预览
??? handlePreview(row) {
????? let url = row.previewUrl;
????? window.open(url);
??? },

这里直接打开url这个字段对应的地址即可,url是在进行文件转换成pdf时生成的映射的服务器上的url

String previewUrl = serverConfig.getUrl()+ Constants.RESOURCE_PREFIX+File.separator+htmFileName;

注意这里的预览地址如果有拦截,让在后台配置中放开白名单。

7、文件下载实现

??? // 下载
??? handleDownload(row) {
????? const baseURL = process.env.VUE_APP_BASE_API
????? window.location.href = baseURL + "/common/download/resourceeasy?resource=" + encodeURI(row.uploadpath);
??? },

这里直接修改后台的下载本地资源的通用下载方法

????@GetMapping("/common/download/resourceeasy")
????public void resourceDownloadEasy(String resource, HttpServletRequest request, HttpServletResponse response)
????????????throws Exception
????{
????????try
????????{
????????????if (!FileUtils.checkAllowDownload(resource))
????????????{
????????????????throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
????????????}
????????????response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
????????????FileUtils.setAttachmentResponseHeader(response, resource);
????????????FileUtils.writeBytes(resource, response.getOutputStream());
????????}
????????catch (Exception e)
????????{
????????????log.error("下载文件失败", e);
????????}
????}

下载效果

8、各层完整代码

前端完整代码

<template>
? <div class="app-container">
??? <el-form
????? :model="queryParams"
????? ref="queryForm"
????? :inline="true"
????? v-show="showSearch"
????? label-width="68px"
??? >
????? <el-form-item label="原文件名" prop="filename">
??????? <el-input
????????? v-model="queryParams.filename"
????????? placeholder="请输入原文件名"
????????? clearable
????????? size="small"
????????? @keyup.enter.native="handleQuery"
??????? />
????? </el-form-item>

????? <el-form-item>
??????? <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery"
????????? >搜索</el-button
??????? >
??????? <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
????? </el-form-item>
??? </el-form>

??? <el-row :gutter="10" class="mb8">
????? <el-col :span="1.5">
??????? <el-button
????????? type="primary"
????????? icon="el-icon-plus"
????????? size="mini"
????????? @click="handleAdd"
????????? v-hasPermi="['basicinfomanage:preview:add']"
????????? >新增</el-button
??????? >
????? </el-col>
????? <el-col :span="1.5">
??????? <el-button
????????? type="success"
????????? icon="el-icon-edit"
????????? size="mini"
????????? :disabled="single"
????????? @click="handleUpdate"
????????? v-hasPermi="['basicinfomanage:preview:edit']"
????????? >修改</el-button
??????? >
????? </el-col>
????? <el-col :span="1.5">
??????? <el-button
????????? type="danger"
????????? icon="el-icon-delete"
????????? size="mini"
????????? :disabled="multiple"
????????? @click="handleDelete"
????????? v-hasPermi="['basicinfomanage:preview:remove']"
????????? >删除</el-button
??????? >
????? </el-col>

????? <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
??? </el-row>

??? <el-table
????? v-loading="loading"
????? :data="previewList"
????? @selection-change="handleSelectionChange"
??? >
????? <el-table-column type="selection" width="55" align="center" />
????? <el-table-column
??????? show-overflow-tooltip
??????? label="文件名"
??????? align="center"
??????? prop="filename"
????? />
????? <el-table-column
??????? show-overflow-tooltip
??????? label="上传后文件路径"
??????? align="center"
??????? prop="uploadpath"
????? />
????? <el-table-column
??????? show-overflow-tooltip
??????? label="转换pdf路径"
??????? align="center"
??????? prop="pdfpath"
??????? width="400"
????? />
?????? <el-table-column
??????? show-overflow-tooltip
??????? label="预览地址"
??????? align="center"
??????? prop="previewUrl"
??????? width="400"
????? />
????? <el-table-column show-overflow-tooltip label="备注" align="center" prop="remark" />
????? <el-table-column
??????? label="操作"
??????? align="center"
??????? class-name="small-padding fixed-width"
??????? width="200"
????? >
??????? <template slot-scope="scope">
????????? <el-button
??????????? size="mini"
??????????? type="text"
??????????? icon="el-icon-edit"
??????????? @click="handleUpdate(scope.row)"
??????????? v-hasPermi="['basicinfomanage:preview:edit']"
??????????? >修改</el-button
????????? >
????????? <el-button
??????????? size="mini"
??????????? type="text"
??????????? icon="el-icon-edit"
??????????? @click="handlePreview(scope.row)"
??????????? >预览</el-button
????????? >
????????? <el-button
??????????? size="mini"
??????????? type="text"
??????????? icon="el-icon-edit"
??????????? @click="handleDownload(scope.row)"
??????????? >下载</el-button
????????? >
????????? <el-button
??????????? size="mini"
??????????? type="text"
??????????? icon="el-icon-delete"
??????????? @click="handleDelete(scope.row)"
??????????? v-hasPermi="['basicinfomanage:preview:remove']"
??????????? >删除</el-button
????????? >
??????? </template>
????? </el-table-column>
??? </el-table>

??? <pagination
????? v-show="total > 0"
????? :total="total"
????? :page.sync="queryParams.pageNum"
????? :limit.sync="queryParams.pageSize"
????? @pagination="getList"
??? />

??? <!-- 添加或修改preview对话框 -->
??? <el-dialog :title="title" :visible.sync="open" width="35%" append-to-body>
????? <el-form ref="form" :model="form" :rules="rules" label-width="110px">
??????? <el-form-item label="文件名" prop="filename">
????????? <el-input v-model="form.filename" placeholder="请输入文件名" disabled />
??????? </el-form-item>
??????? <el-form-item label="上传后文件路径" prop="uploadpath">
????????? <el-input v-model="form.uploadpath" placeholder="请输入上传后文件名" disabled />
??????? </el-form-item>
??????? <el-form-item label="备注" prop="remark">
????????? <el-input v-model="form.remark" placeholder="请输入备注"? />
??????? </el-form-item>
??????? <el-form-item label="附件" prop="photoPath">
????????? <el-upload
??????????? :headers="headers"
??????????? :action="url"
??????????? :multiple="false"
??????????? :file-list="fileList"
??????????? :on-remove="fileRemove"
??????????? :on-success="uploadSuccess"
??????????? :on-error="uploadError"
??????????? :on-progress="uploadProgress"
??????????? :before-upload="beforeUpload"
??????????? :limit="1"
??????????? :on-exceed="beyond"
??????????? accept=".doc,.docx,.xls,.ppt,.xlsx,.pptx"
????????? >
??????????? <el-button size="small">
????????????? 上传
????????????? <i class="el-icon-upload el-icon--right"></i>
??????????? </el-button>
??????????? <div class="el-upload__tip" style="color: red" slot="tip">
????????????? 提示:仅允许导入“.doc、.docx、.xls、.ppt、.xlsx、.pptx”格式文件!
??????????? </div>
????????? </el-upload>
??????? </el-form-item>
????? </el-form>
????? <div slot="footer" class="dialog-footer">
??????? <el-button type="primary" @click="submitForm">确 定</el-button>
??????? <el-button @click="cancel">取 消</el-button>
????? </div>
??? </el-dialog>
? </div>
</template>

<script>
import {
? listPreview,
? getPreview,
? delPreview,
? addPreview,
? updatePreview,
} from "@/api/system/preview";
import { getToken } from "@/utils/auth";

export default {
? name: "preview",
? data() {
??? return {
????? // 遮罩层
????? loading: true,
????? // 选中数组
????? ids: [],
????? // 非单个禁用
????? single: true,
????? // 非多个禁用
????? multiple: true,
????? // 显示搜索条件
????? showSearch: true,
????? // 总条数
????? total: 0,
????? // preview表格数据
????? previewList: [],
????? // 弹出层标题
????? title: "",
????? // 是否显示弹出层
????? open: false,
????? // 查询参数
????? queryParams: {
??????? pageNum: 1,
??????? pageSize: 10,
??????? filename: null,
??????? filetype: null,
??????? uploadpath: null,
??????? pdfpath: null,
??????? pdfname: null,
????? },
????? // 表单参数
????? form: {},
????? // 表单校验
????? rules: {
??????? filename: [
????????? {
??????????? required: true,
??????????? message: "文件名称不能为空",
??????????? trigger: "blur",
????????? },
??????? ],
????? },
????? // 上传按钮闸口
????? btnLoding: false,
????? //? 请求头
????? headers: { Authorization: "Bearer" + " " + getToken() },
????? // 上传地址
????? url: process.env.VUE_APP_BASE_API + "/common/uploadWithAbsolutePath",
????? // 图片列表
????? fileList: [],
??? };
? },
? created() {
??? this.getList();
? },
? methods: {
??? /** 查询preview列表 */
??? getList() {
????? this.loading = true;
????? listPreview(this.queryParams).then((response) => {
??????? this.previewList = response.rows;
??????? this.total = response.total;
??????? this.loading = false;
????? });
??? },
??? // 取消按钮
??? cancel() {
????? this.open = false;
????? this.reset();
??? },
??? // 表单重置
??? reset() {
????? this.form = {
??????? id: null,
??????? filename: null,
??????? uploadpath: null,
????? };
????? this.resetForm("form");
??? },
??? /** 搜索按钮操作 */
??? handleQuery() {
????? this.queryParams.pageNum = 1;
????? this.getList();
??? },
??? /** 重置按钮操作 */
??? resetQuery() {
????? this.resetForm("queryForm");
????? this.handleQuery();
??? },
??? // 多选框选中数据
??? handleSelectionChange(selection) {
????? this.ids = selection.map((item) => item.id);
????? this.single = selection.length !== 1;
????? this.multiple = !selection.length;
??? },
??? /** 新增按钮操作 */
??? handleAdd() {
????? this.fileRemove();
????? this.open = true;
????? this.title = "添加文件";
??? },
??? /** 修改按钮操作 */
??? handleUpdate(row) {
????? this.reset();
????? const id = row.id || this.ids;
????? getPreview(id).then((response) => {
??????? this.form = response.data;
??????? this.open = true;
??????? this.title = "修改文件";
????? });
??? },
??? // 预览
??? handlePreview(row) {
????? let url = row.previewUrl;
????? window.open(url);
??? },
??? // 下载
??? handleDownload(row) {
????? const baseURL = process.env.VUE_APP_BASE_API
????? window.location.href = baseURL + "/common/download/resourceeasy?resource=" + encodeURI(row.uploadpath);
??? },

??? /** 提交按钮 */
??? submitForm() {
????? this.$refs["form"].validate((valid) => {
??????? if (valid) {
????????? if (this.form.id != null) {
??????????? updatePreview(this.form).then((response) => {
????????????? this.msgSuccess("修改成功");
????????????? this.open = false;
????????????? this.fileList = [];
????????????? this.getList();
??????????? });
????????? } else {
??????????? addPreview(this.form).then((response) => {
????????????? this.msgSuccess("新增成功");
????????????? this.open = false;
????????????? this.fileList = [];
????????????? this.getList();
??????????? });
????????? }
??????? }
????? });
??? },
??? /** 删除按钮操作 */
??? handleDelete(row) {
????? const ids = row.id || this.ids;
????? this.$confirm('是否确认删除文件编号为"' + ids + '"的数据项?', "警告", {
??????? confirmButtonText: "确定",
??????? cancelButtonText: "取消",
??????? type: "warning",
????? })
??????? .then(function () {
????????? return delPreview(ids);
??????? })
??????? .then(() => {
????????? this.getList();
????????? this.msgSuccess("删除成功");
??????? });
??? },
??? // 文件上传失败
??? uploadError(err) {
????? this.btnLoding = false;
????? this.$message.error(res.msg);
??? },
??? // 上传中
??? uploadProgress(e) {
????? this.btnLoding = true;
??? },
??? // 文件上传之前
??? beforeUpload(file) {
????? console.log(file, "上传之前");
????? const fileName = file.name;
????? const fileType = fileName.substring(fileName.lastIndexOf("."));
????? if (
??????? fileType === ".doc" ||
??????? fileType === ".docx" ||
??????? fileType === ".xls" ||
??????? fileType === ".ppt" ||
??????? fileType === ".pptx" ||
??????? fileType === ".xlsx"
????? ) {
??????? this.form.filename = file.name;
??????? // 不处理
????? } else {
??????? this.$message.error("请上传正确的文件类型,.doc,.docx,.xls,.ppt,.xlsx,.pptx,");
??????? return false;
????? }
??? },
??? // 文件上传成功
??? uploadSuccess(res, file, fileList) {
????? this.form.uploadpath = res.uploadpath;
????? this.btnLoding = false;
????? this.fileList = fileList;
????? this.$message(res.msg);
??? },
??? beyond(file, fileList) {
????? this.$message({
??????? message: "最多上传一个文件",
??????? type: "warning",
????? });
??? },
??? // 移除选择的文件
??? fileRemove(file, fileList) {
????? this.btnLoding = false;
????? this.reset();
????? this.fileList = [];
??? },
? },
};
</script>

前端js代码

?
import request from '@/utils/request'


// 查询preview列表
export function listPreview(query) {
? return request({
??? url: '/system/preview/list',
??? method: 'get',
??? params: query
? })
}

// 查询preview详细
export function getPreview(id) {
? return request({
??? url: '/system/preview/' + id,
??? method: 'get'
? })
}

// 新增preview
export function addPreview(data) {
? return request({
??? url: '/system/preview',
??? method: 'post',
??? data: data
? })
}

// 修改preview
export function updatePreview(data) {
? return request({
??? url: '/system/preview',
??? method: 'put',
??? data: data
? })
}

// 删除preview
export function delPreview(id) {
? return request({
??? url: '/system/preview/' + id,
??? method: 'delete'
? })
}

?

后台实体类

package com.ruoyi.system.domain;

import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class BusFilePreview extends BaseEntity
{
??? private static final long serialVersionUID = 1L;

??? /** 主键 */
??? private Long id;

??? /** 原文件名(上传前文件名) */
??? @Excel(name = "原文件名", readConverterExp = "上传前文件名")
??? private String filename;

??? /** 文件后缀(.xls;.xlsx;.ppt;.doc;.docx;.pptx) */
??? @Excel(name = "文件后缀", readConverterExp = ".=xls;.xlsx;.ppt;.doc;.docx;.pptx")
??? private String filetype;

??? /** 上传后文件路径 */
??? @Excel(name = "上传后文件路径")
??? private String uploadpath;

??? /** 上传后文件名 */
??? @Excel(name = "上传后文件名")
??? private String uploadfilename;

??? /** 转换pdf路径 */
??? @Excel(name = "转换pdf路径")
??? private String pdfpath;

??? /** 转换pdf文件名 */
??? @Excel(name = "转换pdf文件名")
??? private String pdfname;

??? /** 预览地址 */
??? @Excel(name = "预览地址")
??? private String previewUrl;

??? public String getPreviewUrl() {
??????? return previewUrl;
??? }

??? public void setPreviewUrl(String previewUrl) {
??????? this.previewUrl = previewUrl;
??? }

??? public void setId(Long id)
??? {
??????? this.id = id;
??? }

??? public Long getId()
??? {
??????? return id;
??? }
??? public void setFilename(String filename)
??? {
??????? this.filename = filename;
??? }

??? public String getFilename()
??? {
??????? return filename;
??? }
??? public void setFiletype(String filetype)
??? {
??????? this.filetype = filetype;
??? }

??? public String getFiletype()
??? {
??????? return filetype;
??? }
??? public void setUploadpath(String uploadpath)
??? {
??????? this.uploadpath = uploadpath;
??? }

??? public String getUploadpath()
??? {
??????? return uploadpath;
??? }
??? public void setUploadfilename(String uploadfilename)
??? {
??????? this.uploadfilename = uploadfilename;
??? }

??? public String getUploadfilename()
??? {
??????? return uploadfilename;
??? }
??? public void setPdfpath(String pdfpath)
??? {
??????? this.pdfpath = pdfpath;
??? }

??? public String getPdfpath()
??? {
??????? return pdfpath;
??? }
??? public void setPdfname(String pdfname)
??? {
??????? this.pdfname = pdfname;
??? }

??? public String getPdfname()
??? {
??????? return pdfname;
??? }

??? @Override
??? public String toString() {
??????? return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
??????????????? .append("id", getId())
??????????????? .append("filename", getFilename())
??????????????? .append("filetype", getFiletype())
??????????????? .append("uploadpath", getUploadpath())
??????????????? .append("uploadfilename", getUploadfilename())
??????????????? .append("pdfpath", getPdfpath())
??????????????? .append("pdfname", getPdfname())
??????????????? .append("createTime", getCreateTime())
??????????????? .append("createBy", getCreateBy())
??????????????? .append("updateTime", getUpdateTime())
??????????????? .append("updateBy", getUpdateBy())
??????????????? .append("remark", getRemark())
??????????????? .toString();
??? }
}

后台mapper.xml

?
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.BusFilePreviewMapper">

??? <resultMap type="BusFilePreview" id="BusFilePreviewResult">
??????? <result property="id"??? column="id"??? />
??????? <result property="filename"??? column="fileName"??? />
??????? <result property="filetype"??? column="fileType"??? />
??????? <result property="uploadpath"??? column="uploadPath"??? />
??????? <result property="uploadfilename"??? column="uploadFileName"??? />
??????? <result property="pdfpath"??? column="pdfPath"??? />
??????? <result property="pdfname"??? column="pdfName"??? />
??????? <result property="createTime"??? column="create_time"??? />
??????? <result property="createBy"??? column="create_by"??? />
??????? <result property="updateTime"??? column="update_time"??? />
??????? <result property="updateBy"??? column="update_by"??? />
??????? <result property="remark"??? column="remark"??? />
??????? <result property="previewUrl"??? column="preview_url"??? />
??? </resultMap>

??? <sql id="selectBusFilePreviewVo">
??????? select id, fileName, fileType, uploadPath, uploadFileName, pdfPath, pdfName, create_time, create_by, update_time, update_by, remark ,preview_url from bus_file_preview
??? </sql>

??? <select id="selectBusFilePreviewList" parameterType="BusFilePreview" resultMap="BusFilePreviewResult">
??????? <include refid="selectBusFilePreviewVo"/>
??????? <where>
??????????? <if test="filename != null? and filename != ''"> and fileName like concat('%', #{filename}, '%')</if>
??????????? <if test="filetype != null? and filetype != ''"> and fileType = #{filetype}</if>
??????????? <if test="uploadpath != null? and uploadpath != ''"> and uploadPath = #{uploadpath}</if>
??????????? <if test="uploadfilename != null? and uploadfilename != ''"> and uploadFileName like concat('%', #{uploadfilename}, '%')</if>
??????????? <if test="pdfpath != null? and pdfpath != ''"> and pdfPath = #{pdfpath}</if>
??????????? <if test="pdfname != null? and pdfname != ''"> and pdfName like concat('%', #{pdfname}, '%')</if>
??????? </where>
??? </select>

??? <select id="selectBusFilePreviewById" parameterType="Long" resultMap="BusFilePreviewResult">
??????? <include refid="selectBusFilePreviewVo"/>
??????? where id = #{id}
??? </select>

??? <insert id="insertBusFilePreview" parameterType="BusFilePreview" useGeneratedKeys="true" keyProperty="id">
??????? insert into bus_file_preview
??????? <trim prefix="(" suffix=")" suffixOverrides=",">
??????????? <if test="filename != null">fileName,</if>
??????????? <if test="filetype != null">fileType,</if>
??????????? <if test="uploadpath != null">uploadPath,</if>
??????????? <if test="uploadfilename != null">uploadFileName,</if>
??????????? <if test="pdfpath != null">pdfPath,</if>
??????????? <if test="pdfname != null">pdfName,</if>
??????????? <if test="createTime != null">create_time,</if>
??????????? <if test="createBy != null">create_by,</if>
??????????? <if test="updateTime != null">update_time,</if>
??????????? <if test="updateBy != null">update_by,</if>
??????????? <if test="remark != null">remark,</if>
??????????? <if test="previewUrl != null">preview_url,</if>

???????? </trim>
??????? <trim prefix="values (" suffix=")" suffixOverrides=",">
??????????? <if test="filename != null">#{filename},</if>
??????????? <if test="filetype != null">#{filetype},</if>
??????????? <if test="uploadpath != null">#{uploadpath},</if>
??????????? <if test="uploadfilename != null">#{uploadfilename},</if>
??????????? <if test="pdfpath != null">#{pdfpath},</if>
??????????? <if test="pdfname != null">#{pdfname},</if>
??????????? <if test="createTime != null">#{createTime},</if>
??????????? <if test="createBy != null">#{createBy},</if>
??????????? <if test="updateTime != null">#{updateTime},</if>
??????????? <if test="updateBy != null">#{updateBy},</if>
??????????? <if test="remark != null">#{remark},</if>
??????????? <if test="previewUrl != null">#{previewUrl},</if>
???????? </trim>
??? </insert>

??? <update id="updateBusFilePreview" parameterType="BusFilePreview">
??????? update bus_file_preview
??????? <trim prefix="SET" suffixOverrides=",">
??????????? <if test="filename != null">fileName = #{filename},</if>
??????????? <if test="filetype != null">fileType = #{filetype},</if>
??????????? <if test="uploadpath != null">uploadPath = #{uploadpath},</if>
??????????? <if test="uploadfilename != null">uploadFileName = #{uploadfilename},</if>
??????????? <if test="pdfpath != null">pdfPath = #{pdfpath},</if>
??????????? <if test="pdfname != null">pdfName = #{pdfname},</if>
??????????? <if test="createTime != null">create_time = #{createTime},</if>
??????????? <if test="createBy != null">create_by = #{createBy},</if>
??????????? <if test="updateTime != null">update_time = #{updateTime},</if>
??????????? <if test="updateBy != null">update_by = #{updateBy},</if>
??????????? <if test="remark != null">remark = #{remark},</if>
??????????? <if test="previewUrl != null">preview_url = #{previewUrl},</if>
??????? </trim>
??????? where id = #{id}
??? </update>

??? <delete id="deleteBusFilePreviewById" parameterType="Long">
??????? delete from bus_file_preview where id = #{id}
??? </delete>

??? <delete id="deleteBusFilePreviewByIds" parameterType="String">
??????? delete from bus_file_preview where id in
??????? <foreach item="id" collection="array" open="(" separator="," close=")">
??????????? #{id}
??????? </foreach>
??? </delete>

</mapper>

?

后台mapper接口

package com.ruoyi.system.mapper;



import com.ruoyi.system.domain.BusFilePreview;

import java.util.List;

/**
?* previewMapper接口
?*
?* @author ruoyi
?* @date 2021-10-29
?*/
public interface BusFilePreviewMapper
{
??? /**
???? * 查询preview
???? *
???? * @param id previewID
???? * @return preview
???? */
??? public BusFilePreview selectBusFilePreviewById(Long id);

??? /**
???? * 查询preview列表
???? *
???? * @param busFilePreview preview
???? * @return preview集合
???? */
??? public List<BusFilePreview> selectBusFilePreviewList(BusFilePreview busFilePreview);

??? /**
???? * 新增preview
???? *
???? * @param busFilePreview preview
???? * @return 结果
???? */
??? public int insertBusFilePreview(BusFilePreview busFilePreview);

??? /**
???? * 修改preview
???? *
???? * @param busFilePreview preview
???? * @return 结果
???? */
??? public int updateBusFilePreview(BusFilePreview busFilePreview);

??? /**
???? * 删除preview
???? *
???? * @param id previewID
???? * @return 结果
???? */
??? public int deleteBusFilePreviewById(Long id);

??? /**
???? * 批量删除preview
???? *
???? * @param ids 需要删除的数据ID
???? * @return 结果
???? */
??? public int deleteBusFilePreviewByIds(Long[] ids);
}

后台service接口

package com.ruoyi.system.service;


import com.ruoyi.system.domain.BusFilePreview;

import java.util.List;

/**
?* previewService接口
?*
?* @author ruoyi
?* @date 2021-10-29
?*/
public interface IBusFilePreviewService
{
??? /**
???? * 查询preview
???? *
???? * @param id previewID
???? * @return preview
???? */
??? public BusFilePreview selectBusFilePreviewById(Long id);

??? /**
???? * 查询preview列表
???? *
???? * @param busFilePreview preview
???? * @return preview集合
???? */
??? public List<BusFilePreview> selectBusFilePreviewList(BusFilePreview busFilePreview);

??? /**
???? * 新增preview
???? *
???? * @param busFilePreview preview
???? * @return 结果
???? */
??? public int insertBusFilePreview(BusFilePreview busFilePreview);

??? /**
???? * 修改preview
???? *
???? * @param busFilePreview preview
???? * @return 结果
???? */
??? public int updateBusFilePreview(BusFilePreview busFilePreview);

??? /**
???? * 批量删除preview
???? *
???? * @param ids 需要删除的previewID
???? * @return 结果
???? */
??? public int deleteBusFilePreviewByIds(Long[] ids);

??? /**
???? * 删除preview信息
???? *
???? * @param id previewID
???? * @return 结果
???? */
??? public int deleteBusFilePreviewById(Long id);
}

后台serviceImpl

package com.ruoyi.system.service.impl;


import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.BusFilePreview;
import com.ruoyi.system.mapper.BusFilePreviewMapper;
import com.ruoyi.system.service.IBusFilePreviewService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
?* previewService业务层处理
?*
?* @author ruoyi
?* @date 2021-10-29
?*/
@Service
public class BusFilePreviewServiceImpl implements IBusFilePreviewService
{
??? @Autowired
??? private BusFilePreviewMapper busFilePreviewMapper;

??? /**
???? * 查询preview
???? *
???? * @param id previewID
???? * @return preview
???? */
??? @Override
??? public BusFilePreview selectBusFilePreviewById(Long id)
??? {
??????? return busFilePreviewMapper.selectBusFilePreviewById(id);
??? }

??? /**
???? * 查询preview列表
???? *
???? * @param busFilePreview preview
???? * @return preview
???? */
??? @Override
??? public List<BusFilePreview> selectBusFilePreviewList(BusFilePreview busFilePreview)
??? {
??????? return busFilePreviewMapper.selectBusFilePreviewList(busFilePreview);
??? }

??? /**
???? * 新增preview
???? *
???? * @param busFilePreview preview
???? * @return 结果
???? */
??? @Override
??? public int insertBusFilePreview(BusFilePreview busFilePreview)
??? {
??????? busFilePreview.setCreateTime(DateUtils.getNowDate());
??????? busFilePreview.setCreateBy(String.valueOf(SecurityUtils.getUsername()));// 创建人
??????? return busFilePreviewMapper.insertBusFilePreview(busFilePreview);
??? }

??? /**
???? * 修改preview
???? *
???? * @param busFilePreview preview
???? * @return 结果
???? */
??? @Override
??? public int updateBusFilePreview(BusFilePreview busFilePreview)
??? {
??????? busFilePreview.setUpdateTime(DateUtils.getNowDate());
??????? busFilePreview.setUpdateBy(String.valueOf(SecurityUtils.getUsername()));// 创建人
??????? return busFilePreviewMapper.updateBusFilePreview(busFilePreview);
??? }

??? /**
???? * 批量删除preview
???? *
???? * @param ids 需要删除的previewID
???? * @return 结果
???? */
??? @Override
??? public int deleteBusFilePreviewByIds(Long[] ids)
??? {
??????? return busFilePreviewMapper.deleteBusFilePreviewByIds(ids);
??? }

??? /**
???? * 删除preview信息
???? *
???? * @param id previewID
???? * @return 结果
???? */
??? @Override
??? public int deleteBusFilePreviewById(Long id)
??? {
??????? return busFilePreviewMapper.deleteBusFilePreviewById(id);
??? }
}

后台Controller

package com.ruoyi.web.controller.system;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.pdf.FilePdfUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.config.ServerConfig;
import com.ruoyi.system.domain.BusFilePreview;
import com.ruoyi.system.service.IBusFilePreviewService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

/**
?* previewController
?*
?* @author ruoyi
?* @date 2021-10-29
?*/
@RestController
@RequestMapping("/system/preview")
public class BusFilePreviewController extends BaseController
{
??? @Autowired
??? private IBusFilePreviewService busFilePreviewService;

??? @Autowired
??? private ServerConfig serverConfig;

??? /**
???? * 查询preview列表
???? */
??? @GetMapping("/list")
??? public TableDataInfo list(BusFilePreview busFilePreview)
??? {
??????? startPage();
??????? List<BusFilePreview> list = busFilePreviewService.selectBusFilePreviewList(busFilePreview);
??????? return getDataTable(list);
??? }

??? /**
???? * 获取preview详细信息
???? */

??? @GetMapping(value = "/{id}")
??? public AjaxResult getInfo(@PathVariable("id") Long id)
??? {
??????? return AjaxResult.success(busFilePreviewService.selectBusFilePreviewById(id));
??? }

??? /**
???? * 新增preview
???? */

??? @Log(title = "preview", businessType = BusinessType.INSERT)
??? @PostMapping
??? public AjaxResult add(@RequestBody BusFilePreview busFilePreview) throws IOException{
??????? if (StringUtils.isNull(busFilePreview.getFilename())) {
??????????? AjaxResult.error("缺少文件名称");
??????? }
??????? if (StringUtils.isNull(busFilePreview.getUploadpath())) {
??????????? AjaxResult.error("缺少上传文件路径");
??????? }
??????? String substringAfter = StringUtils.substringAfter(busFilePreview.getUploadpath(), ".");
??????? String upName = StringUtils.substringAfterLast(busFilePreview.getUploadpath(), "/");
??????? busFilePreview.setUploadfilename(upName);
??????? busFilePreview.setFiletype(substringAfter); //类型
??????? if ("pdf".equals(substringAfter)){
??????????? FilePdfUtils.copyFile(busFilePreview.getUploadpath(), RuoYiConfig.getProfile());
??????????? String pdfName = StringUtils.substringAfterLast(busFilePreview.getUploadpath(), "/");
??????????? busFilePreview.setPdfpath(RuoYiConfig.getProfile()+ "/" + pdfName);
??????????? busFilePreview.setPdfname(pdfName);
??????????? return? toAjax(busFilePreviewService.insertBusFilePreview(busFilePreview));
??????? }

??????? File file = new File(busFilePreview.getUploadpath());
??????? FileInputStream fileInputStream = new FileInputStream(file);
??????? String htmFileName = FilePdfUtils.file2pdf(fileInputStream, substringAfter,RuoYiConfig.getProfile());
??????? String pdfPath = RuoYiConfig.getProfile()+ "/" + htmFileName;
??????? busFilePreview.setPdfpath(pdfPath);
??????? String pdfName = StringUtils.substringAfterLast(pdfPath, "/");
??????? busFilePreview.setPdfname(pdfName);
??????? String previewUrl = serverConfig.getUrl()+ Constants.RESOURCE_PREFIX+File.separator+htmFileName;
??????? busFilePreview.setPreviewUrl(previewUrl);
??????? return toAjax(busFilePreviewService.insertBusFilePreview(busFilePreview));
??? }

??? /**
???? * 修改preview
???? */
??? @Log(title = "preview", businessType = BusinessType.UPDATE)
??? @PutMapping
??? public AjaxResult edit(@RequestBody BusFilePreview busFilePreview) throws IOException {
??????? if (StringUtils.isNull(busFilePreview.getFilename())) {
??????????? AjaxResult.error("缺少文件名称");
??????? }
??????? if (StringUtils.isNull(busFilePreview.getUploadpath())) {
??????????? AjaxResult.error("缺少上传文件路径");
??????? }
??????? String substringAfter = StringUtils.substringAfter(busFilePreview.getUploadpath(), ".");
??????? String upName = StringUtils.substringAfterLast(busFilePreview.getUploadpath(), "/");
??????? busFilePreview.setUploadfilename(upName);
??????? busFilePreview.setFiletype(substringAfter); //类型
??????? if ("pdf".equals(substringAfter)){
??????????? FilePdfUtils.copyFile(busFilePreview.getUploadpath(), RuoYiConfig.getProfile());
??????????? String pdfName = StringUtils.substringAfterLast(busFilePreview.getUploadpath(), "/");
??????????? busFilePreview.setPdfpath(RuoYiConfig.getProfile()+ "/" + pdfName);
??????????? busFilePreview.setPdfname(pdfName);
??????????? return? toAjax(busFilePreviewService.insertBusFilePreview(busFilePreview));
??????? }

??????? File file = new File(busFilePreview.getUploadpath());
??????? FileInputStream fileInputStream = new FileInputStream(file);
??????? String htmFileName = FilePdfUtils.file2pdf(fileInputStream, substringAfter,RuoYiConfig.getProfile());
??????? String pdfPath = RuoYiConfig.getProfile()+ "/" + htmFileName;
??????? busFilePreview.setPdfpath(pdfPath);
??????? String pdfName = StringUtils.substringAfterLast(pdfPath, "/");
??????? busFilePreview.setPdfname(pdfName);
??????? String previewUrl = serverConfig.getUrl()+ Constants.RESOURCE_PREFIX+File.separator+htmFileName;
??????? busFilePreview.setPreviewUrl(previewUrl);
??????? return toAjax(busFilePreviewService.updateBusFilePreview(busFilePreview));
??? }

??? /**
???? * 删除preview
???? */
??? @Log(title = "preview", businessType = BusinessType.DELETE)
?@DeleteMapping("/{ids}")
??? public AjaxResult remove(@PathVariable Long[] ids)
??? {
??????? return toAjax(busFilePreviewService.deleteBusFilePreviewByIds(ids));
??? }

??? @GetMapping("/pdf")
??? @ApiOperation(value = "预览")
??? public void prePDF(Long id, HttpServletRequest request, HttpServletResponse response) throws IOException {
??????? BusFilePreview busFilePreview = busFilePreviewService.selectBusFilePreviewById(id);
??????? if (StringUtils.isNotNull(busFilePreview) && StringUtils.isNotNull(busFilePreview.getPdfpath())) {
??????????? File file = new File(busFilePreview.getPdfpath());
??????????? if (file.exists()) {
??????????????? byte[] data = null;
??????????????? try {
??????????????????? FileInputStream input = new FileInputStream(file);
??????????????????? data = new byte[input.available()];
??????????????????? input.read(data);
??????????????????? response.getOutputStream().write(data);
??????????????????? input.close();
??????????????? } catch (Exception e) {
??????????????????? e.printStackTrace();
??????????????? }
??????????? } else if (!file.exists()){
??????????????? BusFilePreview filePreview = new BusFilePreview();
??????????????? filePreview.setId(id);
??????????????? filePreview.setRemark("文件不存在");
??????????????? busFilePreviewService.updateBusFilePreview(filePreview);
??????????? }
??????? }
??? }
}

后台通用Controller

package com.ruoyi.web.controller.common;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.framework.config.ServerConfig;

import java.io.File;

/**
?* 通用请求处理
?*
?* @author ruoyi
?*/
@RestController
public class CommonController
{
??? private static final Logger log = LoggerFactory.getLogger(CommonController.class);

??? @Autowired
??? private ServerConfig serverConfig;

??? /**
???? * 通用下载请求
???? *
???? * @param fileName 文件名称
???? * @param delete 是否删除
???? */
??? @GetMapping("common/download")
??? public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
??? {
??????? try
??????? {
??????????? if (!FileUtils.checkAllowDownload(fileName))
??????????? {
??????????????? throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
??????????? }
??????????? String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
??????????? String filePath = RuoYiConfig.getDownloadPath() + fileName;

??????????? response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
??????????? FileUtils.setAttachmentResponseHeader(response, realFileName);
??????????? FileUtils.writeBytes(filePath, response.getOutputStream());
??????????? if (delete)
??????????? {
??????????????? FileUtils.deleteFile(filePath);
??????????? }
??????? }
??????? catch (Exception e)
??????? {
??????????? log.error("下载文件失败", e);
??????? }
??? }

??? /**
???? * 通用上传请求
???? */
??? @PostMapping("/common/upload")
??? public AjaxResult uploadFile(MultipartFile file) throws Exception
??? {
??????? try
??????? {
??????????? // 上传文件路径
??????????? String filePath = RuoYiConfig.getUploadPath();
??????????? // 上传并返回新文件名称
??????????? String fileName = FileUploadUtils.upload(filePath, file);
??????????? String url = serverConfig.getUrl() + fileName;
??????????? AjaxResult ajax = AjaxResult.success();
??????????? ajax.put("fileName", fileName);
??????????? ajax.put("url", url);
??????????? return ajax;
??????? }
??????? catch (Exception e)
??????? {
??????????? return AjaxResult.error(e.getMessage());
??????? }
??? }

??? /**
???? * 通用上传请求返回磁盘路径
???? */
??? @PostMapping("/common/uploadWithAbsolutePath")
??? public AjaxResult uploadFileWithAbsolutePath(MultipartFile file) throws Exception
??? {
??????? try
??????? {
??????????? // 上传文件路径
??????????? String filePath = RuoYiConfig.getUploadPath();
??????????? // 上传并返回新文件名称
??????????? String fileName = FileUploadUtils.uploadWithAbsolutePath(filePath, file);
??????????? AjaxResult ajax = AjaxResult.success();
??????????? ajax.put("uploadpath", filePath+ File.separator+fileName);
??????????? return ajax;
??????? }
??????? catch (Exception e)
??????? {
??????????? return AjaxResult.error(e.getMessage());
??????? }
??? }

??? /**
???? * 本地资源通用下载
???? */
??? @GetMapping("/common/download/resource")
??? public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
??????????? throws Exception
??? {
??????? try
??????? {
??????????? if (!FileUtils.checkAllowDownload(resource))
??????????? {
??????????????? throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
??????????? }
??????????? // 本地资源路径
??????????? String localPath = RuoYiConfig.getProfile();
??????????? // 数据库资源地址
??????????? String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
??????????? // 下载名称
??????????? String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
??????????? response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
??????????? FileUtils.setAttachmentResponseHeader(response, downloadName);
??????????? FileUtils.writeBytes(downloadPath, response.getOutputStream());
??????? }
??????? catch (Exception e)
??????? {
??????????? log.error("下载文件失败", e);
??????? }
??? }

??? /**
???? * 本地资源通用下载
???? */
??? @GetMapping("/common/download/resourceeasy")
??? public void resourceDownloadEasy(String resource, HttpServletRequest request, HttpServletResponse response)
??????????? throws Exception
??? {
??????? try
??????? {
??????????? if (!FileUtils.checkAllowDownload(resource))
??????????? {
??????????????? throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
??????????? }
??????????? response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
??????????? FileUtils.setAttachmentResponseHeader(response, resource);
??????????? FileUtils.writeBytes(resource, response.getOutputStream());
??????? }
??????? catch (Exception e)
??????? {
??????????? log.error("下载文件失败", e);
??????? }
??? }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 12:37:37  更:2021-11-17 12:39:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:04:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码