kkfileview踩坑记录

您所在的位置:网站首页 如何清理office缓存文件 kkfileview踩坑记录

kkfileview踩坑记录

2024-03-24 01:24| 来源: 网络整理| 查看: 265

kkfileview自带的每天凌晨三点清除所有缓存的方法是会把所有的文件全部清楚的 自带的删除文件的方法是删除源文件,但是如果之前预览生成了临时本地文件和类似转换过的pdf文件以及图片目录,是不会给你删除的。 这样就有一个坑:因为你只是删除的源文件,并没有删除缓存到本地的问题,所以当你修改源文件重新上传之后,预览到的还是之前缓存的文件。所以在删除文件的时候要清楚缓存+删除缓存到本地的文件。 还有一个坑:上传一个a.pdf然后预览,然后再上传一个a.docx然后你会发现,你预览的文件是之前pdf的文件,重名坑就这么突然的出现了。

先说解决重名的坑,代码如下:

// 文件:OfficeFilePreviewImpl //String pdfName = fileName.substring(0, fileName.lastIndexOf(".") + 1) + (isHtml ? "html" : "pdf"); //加上一个后缀来区分,这样就不会有重名问题了 String pdfName = fileName.replace(".", "-") + "." + (isHtml ? "html" : "pdf");

注意当你删除office文件时记得你此时缓存到本地的文件名已经是加了后缀的文件了!!!

根据URL删除文件缓存代码:

// 我是通过接口删除的 @GetMapping("/cleanCache") public void cleanCache(ServletResponse servletResponse, String urlPath, Model model, HttpServletRequest req) throws IOException { HttpServletResponse response = (HttpServletResponse) servletResponse; response.addHeader("Access-Control-Allow-Origin", "*"); if (urlPath == null || urlPath.length() == 0) { logger.info("URL异常:{}", urlPath); response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.setHeader("Content-Type", "text/html; charset=UTF-8"); response.getWriter().println("NULL地址不允许清缓存"); return; } String fileUrl; fileUrl = WebUtils.decodeUrl(urlPath); String fullFileName = WebUtils.getFileNameFromURL(fileUrl); FileAttribute fileAttribute = fileHandlerService.getFileAttribute(fileUrl, req); String suffix = fileAttribute.getSuffix(); // 重名问题遗留的文件名后缀处理 if (FileType.OFFICE.equals(fileAttribute.getType())) { boolean isHtml = suffix.equalsIgnoreCase("xls") || suffix.equalsIgnoreCase("xlsx") || suffix.equalsIgnoreCase("csv"); fullFileName = fullFileName.replace(".", "-") + "." + (isHtml ? "html" : "pdf"); } logger.info("清空缓存文件Start"); cacheService.cleanCacheByFileName(fullFileName); logger.info("清空缓存文件End"); // 删除下载的文件 model.addAttribute("file", fileAttribute); FilePreview filePreview = previewFactory.get(fileAttribute); logger.info("删除文件url:{},previewType:{}", fileUrl, fileAttribute.getType()); filePreview.fileDeleteHandle(fileUrl, model, fileAttribute); } =============================================================================== CacheService类 增加接口 void cleanCacheByFileName(String fileName); ================================================================================ 三个缓存方式实现此接口jdk redis rocksDB ----------------------------------------- 文件位置:CacheServiceJDKImpl @Override public void cleanCacheByFileName(String fileName) { initPDFCachePool(fileName); initIMGCachePool(fileName); initPdfImagesCachePool(fileName); } private void initPDFCachePool(String fileName) { pdfCache.remove(fileName); } private void initIMGCachePool(String fileName) { imgCache.remove(fileName); } private void initPdfImagesCachePool(String fileName) { pdfImagesCache.remove(fileName); } 文件位置:CacheServiceRedisImpl @Override public void cleanCacheByFileName(String fileName) { cleanPdfCache(fileName); cleanImgCache(fileName); cleanPdfImgCache(fileName); } private void cleanPdfCache(String fileName) { RMapCache pdfCache = redissonClient.getMapCache(FILE_PREVIEW_PDF_KEY); pdfCache.remove(fileName); } private void cleanImgCache(String fileName) { RMapCache imgCache = redissonClient.getMapCache(FILE_PREVIEW_IMGS_KEY); imgCache.remove(fileName); } private void cleanPdfImgCache(String fileName) { RMapCache pdfImg = redissonClient.getMapCache(FILE_PREVIEW_PDF_IMGS_KEY); pdfImg.remove(fileName); } 文件位置:CacheServiceRocksDBImpl @Override public void cleanCacheByFileName(String fileName) { try { cleanPdfCache(fileName); cleanImgCache(fileName); cleanPdfImgCache(fileName); } catch (IOException | RocksDBException e) { LOGGER.error("Clean Cache Exception" + e); } } //todo 按照文件名删除rocksDb缓存 private void cleanPdfCache(String fileName) throws IOException, RocksDBException { Map pdfCacheItem = getPDFCache(); pdfCacheItem.remove(fileName); db.put(FILE_PREVIEW_PDF_KEY.getBytes(), toByteArray(pdfCacheItem)); } private void cleanImgCache(String fileName) throws IOException, RocksDBException { Map imgCacheItem = getImgCache(); imgCacheItem.remove(fileName); db.put(FILE_PREVIEW_IMGS_KEY.getBytes(), toByteArray(imgCacheItem)); } private void cleanPdfImgCache(String fileName) throws IOException, RocksDBException { Map pdfImageCacheItem = getPdfImageCaches(); String imgFileName = ConfigConstants.getFileDir() + fileName; pdfImageCacheItem.remove(imgFileName); db.put(FILE_PREVIEW_PDF_IMGS_KEY.getBytes(), toByteArray(pdfImageCacheItem)); } 清理缓存之后 接下来删除下载到本地和转换后的文件 文件位置:FilePreview void fileDeleteHandle(String fileUrl, Model model, FileAttribute fileAttribute); 这里要针对每一个实现类去自定义删除

在这里插入图片描述 太多了就只拿officFilePreviewImpl举栗子

@Override public void fileDeleteHandle(String fileUrl, Model model, FileAttribute fileAttribute) { String suffix = fileAttribute.getSuffix(); String fileName = fileAttribute.getName(); String userToken = fileAttribute.getUserToken(); boolean isHtml = suffix.equalsIgnoreCase("xls") || suffix.equalsIgnoreCase("xlsx") || suffix.equalsIgnoreCase("csv"); String pdfName = fileName.replace(".", "-") + "." + (isHtml ? "html" : "pdf"); String cacheFileName = userToken == null ? pdfName : userToken + "_" + pdfName; String outFilePath = FILE_DIR + cacheFileName; String filePathSource = FILE_DIR + fileName; String fileDirPath = FILE_DIR + cacheFileName.substring(0, cacheFileName.lastIndexOf(".")); KkFileUtils.deleteDirectory(filePathSource); KkFileUtils.deleteDirectory(outFilePath); KkFileUtils.deleteDirectory(fileDirPath); }

大功告成!!!搞了两天服了 可能会有bug,欢迎指正



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3