Spring Boot搭建的一个在线文件预览系统( 二 )
FilePreview 是文件预览接口 , 不同的文件类型的预览都实现了 FilePreview 接口 , 并实现了 filePreviewHandle() 方法 。
文件预览接口public interface FilePreview {String filePreviewHandle(String url, Model model, FileAttribute fileAttribute);}【Spring Boot搭建的一个在线文件预览系统】不同的文件类型的预览都实现了 FilePreview 接口 , 如下图所示 。
文章插图
不同文件类型的预览都会实现 FilePreview 接口 , 然后重写filePreviewHandle()方法 。 比如:OfficeFilePreviewImpl 这个主要负责处理 office 文件的预览、PdfFilePreviewImpl 主要负责处理 pdf 文件的预览 。
文件预览具体实现分析下面我们以 office 文件的预览为入口来分析 。
首先要明确的是 excel 类型的预览是通过将 excel 文件转换为 HTML 实现的 , 其他类型 office 文件的预览是通过将文件转换为 PDF 或者是 图片的方式来预览的 。
举个例子 。 我们上传了一份名为 武汉市文化市场管理办法.docx 的 Word 文件并预览的话 , jodconverter-web/src/main/file 路径下会生成两个相关文件 , 这两个文件分别对应了我们提到的 PDF 预览 和 图片预览这两种方式 。
- 武汉市文化市场管理办法.pdf
- 由 Word 文件所转化得到的一系列图片
文章插图我们以一个名为 武汉市文化市场管理办法.docx 的文件来举例说明一下代码中是如何做的 。
通过分析代码 ,我们定位到了 OfficeFilePreviewImpl 这个主要负责处理 office 文件预览的类 。
/** * 处理office文件 */@Servicepublic class OfficeFilePreviewImpl implements FilePreview {}我们来简单分析一下 OfficeFilePreviewImpl 类中实现预览的核心方法是 filePreviewHandle。说明:这部分代码的逻辑不够清晰 , 还可以抽方法优化以让人更容易读懂 , 感兴趣的小伙伴可以自己动手重构一下 , 然后去给作者提个 PR 。
@Overridepublic String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {// 1.获取预览类型(image/pdf/html) , 用户请求中传了officePreviewType参数就取参数的 , 没传取系统默认(image)String officePreviewType = model.asMap().get("officePreviewType") == null ? ConfigConstants.getOfficePreviewType() : model.asMap().get("officePreviewType").toString();// 2.获取 URL 地址String baseUrl = BaseUrlFilter.getBaseUrl();// http://localhost:8012/// 3.获取图片相关信息String suffix=fileAttribute.getSuffix();//文件后缀如docxString fileName=fileAttribute.getName();//文件名如:武汉市文化市场管理办法.docx// 4. 判断是否为 html 格式预览也就是判断文件否为 excelboolean isHtml = suffix.equalsIgnoreCase("xls") || suffix.equalsIgnoreCase("xlsx");// 5. 将文件的后缀名更换为 .pdf 或者 .html(excel文件的情况)String pdfName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + (isHtml ? "html" : "pdf");// 6. 转换后的文件输出的文件夹如 file-online-preview/jodconverter-web/src/main/file/武汉市文化市场管理办法.pdf)String outFilePath = FILE_DIR + pdfName;// 7 .判断之前是否已转换过 , 如果转换过 , 直接返回 , 否则执行转换// 文件第一次被预览的时候会首先对文件进行缓存处理if (!fileUtils.listConvertedFiles().containsKey(pdfName) || !ConfigConstants.isCacheEnabled()) {String filePath;// 下载文件ReturnResponse response = downloadUtils.downLoad(fileAttribute, null);if (0 != response.getCode()) {model.addAttribute("fileType", suffix);model.addAttribute("msg", response.getMsg());return "fileNotSupported";}filePath = response.getContent();if (StringUtils.hasText(outFilePath)) {officeToPdf.openOfficeToPDF(filePath, outFilePath);if (isHtml) {// 对转换后的文件进行操作(改变编码方式)fileUtils.doActionConvertedFile(outFilePath);}if (ConfigConstants.isCacheEnabled()) {// 加入缓存fileUtils.addConvertedFile(pdfName, fileUtils.getRelativePath(outFilePath));}}}// 8.根据预览类型officePreviewType , 选择不同的预览方式// 比如,如果预览类型officePreviewType为pdf则进行pdf方式预览if (!isHtml}model.addAttribute("pdfUrl", pdfName);return isHtml ? "html" : "pdf";}项目地址:原文地址:
- Spring security CSRF 跨域访问限制问题
- 面试官:问你一个,Spring事务是如何传播的?
- 对Spring MVC接口进行Mock测试
- 易唐云网使用ActiveReports,搭建信息共享平台
- Spring Cloud Alibaba之 Sentinel
- SpringBoot+MyBatis+MySQL读写分离实现
- SpringBoot构造流程源码分析:Web应用类型推断
- 搭建私有Sentry日志收集系统并集成到springboot
- 搭建可信平台,IMU PLUS“链”信未来
- 慢即是快!玩具产品品牌跨境出海基础搭建和后续做加法的矛与盾
