From ef46e2c51e9f138b4d441d19108d5ac1da28f6ef Mon Sep 17 00:00:00 2001 From: kl Date: Mon, 28 Dec 2020 11:13:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BAurl=20base64=E8=A7=A3?= =?UTF-8?q?=E7=A0=81=E5=A4=B1=E8=B4=A5=E6=97=B6=E7=9A=84=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OtherFilePreviewImpl.java | 24 +++++++++++++-- .../controller/OnlinePreviewController.java | 30 ++++++++++++++----- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/cn/keking/service/impl/OtherFilePreviewImpl.java b/server/src/main/java/cn/keking/service/impl/OtherFilePreviewImpl.java index 48a17ff8..fb5e8f04 100644 --- a/server/src/main/java/cn/keking/service/impl/OtherFilePreviewImpl.java +++ b/server/src/main/java/cn/keking/service/impl/OtherFilePreviewImpl.java @@ -15,7 +15,7 @@ public class OtherFilePreviewImpl implements FilePreview { @Override public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) { - return this.notSupportedFile(model,fileAttribute,"系统还不支持该格式文件的在线预览"); + return this.notSupportedFile(model, fileAttribute, "系统还不支持该格式文件的在线预览"); } /** @@ -24,8 +24,28 @@ public class OtherFilePreviewImpl implements FilePreview { * @return 页面 */ public String notSupportedFile(Model model, FileAttribute fileAttribute, String errMsg) { - model.addAttribute("fileType", fileAttribute.getSuffix()); + return this.notSupportedFile(model, fileAttribute.getSuffix(), errMsg); + } + + /** + * 通用的预览失败,导向到不支持的文件响应页面 + * + * @return 页面 + */ + public String notSupportedFile(Model model, String errMsg) { + return this.notSupportedFile(model, "未知", errMsg); + } + + /** + * 通用的预览失败,导向到不支持的文件响应页面 + * + * @return 页面 + */ + public String notSupportedFile(Model model, String fileType, String errMsg) { + model.addAttribute("fileType", fileType); model.addAttribute("msg", errMsg); return NOT_SUPPORTED_FILE_PAGE; } + + } diff --git a/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java b/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java index 3198ac1f..81e5110b 100644 --- a/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java +++ b/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java @@ -5,6 +5,7 @@ import cn.keking.service.FilePreview; import cn.keking.service.FilePreviewFactory; import cn.keking.service.cache.CacheService; +import cn.keking.service.impl.OtherFilePreviewImpl; import cn.keking.utils.DownloadUtils; import cn.keking.service.FileHandlerService; import org.slf4j.Logger; @@ -31,21 +32,30 @@ import static cn.keking.service.FilePreview.PICTURE_FILE_PREVIEW_PAGE; @Controller public class OnlinePreviewController { + public static final String BASE64_DECODE_ERROR_MSG = "Base64解码失败,请检查你的 %s 是否采用 Base64 + urlEncode 双重编码了!"; private final Logger logger = LoggerFactory.getLogger(OnlinePreviewController.class); private final FilePreviewFactory previewFactory; private final CacheService cacheService; private final FileHandlerService fileHandlerService; + private final OtherFilePreviewImpl otherFilePreview; - public OnlinePreviewController(FilePreviewFactory filePreviewFactory, FileHandlerService fileHandlerService, CacheService cacheService) { + public OnlinePreviewController(FilePreviewFactory filePreviewFactory, FileHandlerService fileHandlerService, CacheService cacheService, OtherFilePreviewImpl otherFilePreview) { this.previewFactory = filePreviewFactory; this.fileHandlerService = fileHandlerService; this.cacheService = cacheService; + this.otherFilePreview = otherFilePreview; } @RequestMapping(value = "/onlinePreview") public String onlinePreview(String url, Model model, HttpServletRequest req) { - String fileUrl = new String(Base64Utils.decodeFromString(url)); + String fileUrl; + try { + fileUrl = new String(Base64Utils.decodeFromString(url)); + } catch (Exception ex) { + String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "url"); + return otherFilePreview.notSupportedFile(model, errorMsg); + } FileAttribute fileAttribute = fileHandlerService.getFileAttribute(fileUrl, req); FilePreview filePreview = previewFactory.get(fileAttribute); logger.info("预览文件url:{},previewType:{}", fileUrl, fileAttribute.getType()); @@ -54,18 +64,24 @@ public class OnlinePreviewController { @RequestMapping(value = "/picturesPreview") public String picturesPreview(String urls, Model model, HttpServletRequest req) throws UnsupportedEncodingException { - String fileUrls = new String(Base64Utils.decodeFromString(urls)); + String fileUrls; + try { + fileUrls = new String(Base64Utils.decodeFromString(urls)); + } catch (Exception ex) { + String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "urls"); + return otherFilePreview.notSupportedFile(model, errorMsg); + } logger.info("预览文件url:{},urls:{}", fileUrls, urls); // 抽取文件并返回文件列表 - String[] imgs = fileUrls.split("\\|"); - List imgUrls = Arrays.asList(imgs); + String[] images = fileUrls.split("\\|"); + List imgUrls = Arrays.asList(images); model.addAttribute("imgUrls", imgUrls); String currentUrl = req.getParameter("currentUrl"); - if(StringUtils.hasText(currentUrl)){ + if (StringUtils.hasText(currentUrl)) { String decodedCurrentUrl = new String(Base64Utils.decodeFromString(currentUrl)); model.addAttribute("currentUrl", decodedCurrentUrl); - }else { + } else { model.addAttribute("currentUrl", imgUrls.get(0)); } return PICTURE_FILE_PREVIEW_PAGE;