Spring Boot搭建的一个在线文件预览系统( 二 )

两种模式的适用场景如下

  • 图片预览 :Word 文件大(加载 PDF 速度比较慢)的情况 。
  • PDF 预览 :内网访问(加载 PDF 速度比较快)的情况 。
图片预览模式预览效果如下:
Spring Boot搭建的一个在线文件预览系统文章插图
PDF 预览模式预览效果如下:
Spring Boot搭建的一个在线文件预览系统文章插图
PDF 文档的预览kkFileView 支持 PDF 文档预览 。 类似 Word 文档预览 ,PDF 预览提供了两种模式:
  • 每页 Word 转为图片预览
  • 整个 Word 文档转成 PDF , 再预览 PDF 。
由于和 Word 文档的预览展示效果一致 , 这里就不放图片了 。
文件预览核心代码分析API 层文件预览调用的接口是 /onlinePreview。
通过分析 /onlinePreview 接口我们发现 ,后端接收到预览请求之后 , 会从 URL 和请求中筛选出自己需要的信息比如文件后缀、文件名 。
之后会调用FilePreview类 的 filePreviewHandle() 方法 。 filePreviewHandle()方法是实现文件预览的核心方法 。
@RequestMapping(value = "http://kandian.youth.cn/onlinePreview")public String onlinePreview(String url, Model model, HttpServletRequest req) {FileAttribute fileAttribute = fileUtils.getFileAttribute(url);req.setAttribute("fileKey", req.getParameter("fileKey"));model.addAttribute("pdfDownloadDisable", ConfigConstants.getPdfDownloadDisable());model.addAttribute("officePreviewType", req.getParameter("officePreviewType"));FilePreview filePreview = previewFactory.get(fileAttribute);logger.info("预览文件url:{} , previewType:{}", url, fileAttribute.getType());return filePreview.filePreviewHandle(url, model, fileAttribute);}FilePreview 是文件预览接口 , 不同的文件类型的预览都实现了 FilePreview 接口 , 并实现了 filePreviewHandle() 方法 。
文件预览接口public interface FilePreview {String filePreviewHandle(String url, Model model, FileAttribute fileAttribute);}不同的文件类型的预览都实现了 FilePreview 接口 , 如下图所示 。
Spring Boot搭建的一个在线文件预览系统文章插图
不同文件类型的预览都会实现 FilePreview 接口 , 然后重写filePreviewHandle()方法 。 比如:OfficeFilePreviewImpl 这个主要负责处理 office 文件的预览、PdfFilePreviewImpl 主要负责处理 pdf 文件的预览 。
文件预览具体实现分析下面我们以 office 文件的预览为入口来分析 。
首先要明确的是 excel 类型的预览是通过将 excel 文件转换为 HTML 实现的 , 其他类型 office 文件的预览是通过将文件转换为 PDF 或者是 图片的方式来预览的 。
举个例子 。 我们上传了一份名为 武汉市文化市场管理办法.docx 的 Word 文件并预览的话 , jodconverter-web/src/main/file 路径下会生成两个相关文件 , 这两个文件分别对应了我们提到的 PDF 预览 和 图片预览这两种方式 。
  • 武汉市文化市场管理办法.pdf
  • 由 Word 文件所转化得到的一系列图片

Spring Boot搭建的一个在线文件预览系统文章插图
我们以一个名为 武汉市文化市场管理办法.docx 的文件来举例说明一下代码中是如何做的 。
通过分析代码 ,我们定位到了 OfficeFilePreviewImpl 这个主要负责处理 office 文件预览的类 。


推荐阅读