diff --git a/src/main/java/com/jmal/clouddisk/controller/rest/VideoController.java b/src/main/java/com/jmal/clouddisk/controller/rest/VideoController.java index 21c99b03..415f0b56 100644 --- a/src/main/java/com/jmal/clouddisk/controller/rest/VideoController.java +++ b/src/main/java/com/jmal/clouddisk/controller/rest/VideoController.java @@ -1,9 +1,9 @@ package com.jmal.clouddisk.controller.rest; -import cn.hutool.core.io.FileUtil; import com.jmal.clouddisk.config.FileProperties; import com.jmal.clouddisk.service.IShareService; import com.jmal.clouddisk.util.FileContentTypeUtils; +import com.jmal.clouddisk.util.MyFileUtils; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -38,7 +38,7 @@ public ResponseEntity m3u8(@PathVariable String username, @PathVari Path txtPath = Paths.get(fileProperties.getRootDir(), fileProperties.getChunkFileDir(), username, fileProperties.getVideoTranscodeCache(), fileId, suffix); UrlResource videoResource = new UrlResource(txtPath.toUri()); return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_TYPE, FileContentTypeUtils.getContentType(FileUtil.extName(suffix))) + .header(HttpHeaders.CONTENT_TYPE, FileContentTypeUtils.getContentType(MyFileUtils.extName(suffix))) .header(HttpHeaders.CACHE_CONTROL, "max-age=600") .body(videoResource); } diff --git a/src/main/java/com/jmal/clouddisk/interceptor/FileInterceptor.java b/src/main/java/com/jmal/clouddisk/interceptor/FileInterceptor.java index ada1ddce..4e9d1ea4 100644 --- a/src/main/java/com/jmal/clouddisk/interceptor/FileInterceptor.java +++ b/src/main/java/com/jmal/clouddisk/interceptor/FileInterceptor.java @@ -332,7 +332,7 @@ private void responseHeader(HttpServletResponse response, String fileName, byte[ if (!CharSequenceUtil.isBlank(fileName)) { response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "fileName=" + ContentDisposition.builder("attachment") .filename(UriUtils.encode(fileName, StandardCharsets.UTF_8))); - response.setHeader(HttpHeaders.CONTENT_TYPE, FileContentTypeUtils.getContentType(FileUtil.extName(fileName))); + response.setHeader(HttpHeaders.CONTENT_TYPE, FileContentTypeUtils.getContentType(MyFileUtils.extName(fileName))); } if (img != null) { response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(img.length)); @@ -374,9 +374,9 @@ public static byte[] imageCrop(File srcFile, String q, String w, String h) { int srcHeight = bim.getHeight(); // 处理质量参数 - double quality = parseQuality(q, 0.8); - int width = parseDimension(w, -1); - int height = parseDimension(h, -1); + double quality = parseQuality(q); + int width = parseDimension(w); + int height = parseDimension(h); Thumbnails.Builder thumbnail = Thumbnails.of(bim) .outputFormat("jpg") // 指定输出格式 @@ -419,20 +419,20 @@ public static byte[] imageCrop(File srcFile, String q, String w, String h) { return new byte[0]; } - private static double parseQuality(String q, double defaultQuality) { + private static double parseQuality(String q) { try { double quality = Double.parseDouble(q); - return (quality >= 0 && quality <= 1) ? quality : defaultQuality; + return (quality >= 0 && quality <= 1) ? quality : 0.8; } catch (NumberFormatException e) { - return defaultQuality; + return 0.8; } } - private static int parseDimension(String dim, int defaultValue) { + private static int parseDimension(String dim) { try { return Integer.parseInt(dim); } catch (NumberFormatException e) { - return defaultValue; + return -1; } } diff --git a/src/main/java/com/jmal/clouddisk/lucene/LuceneService.java b/src/main/java/com/jmal/clouddisk/lucene/LuceneService.java index dacb9c94..e1892d75 100644 --- a/src/main/java/com/jmal/clouddisk/lucene/LuceneService.java +++ b/src/main/java/com/jmal/clouddisk/lucene/LuceneService.java @@ -308,7 +308,7 @@ public void setFileIndex(FileIndex fileIndex) { private void setType(File file, FileIndex fileIndex) { String fileName = file.getName(); - String suffix = FileUtil.extName(fileName); + String suffix = MyFileUtils.extName(fileName); fileIndex.setType(Constants.OTHER); if (StrUtil.isBlank(suffix)) { fileIndex.setType(Constants.OTHER); @@ -380,7 +380,7 @@ private boolean checkFileContent(File file) { if (!file.isFile() || file.length() < 1) { return false; } - String type = FileTypeUtil.getType(file); + String type = FileTypeUtil.getType(file).toLowerCase(); if (MyFileUtils.hasContentFile(type)) { return true; } diff --git a/src/main/java/com/jmal/clouddisk/oss/FileInfo.java b/src/main/java/com/jmal/clouddisk/oss/FileInfo.java index a7afe901..15bad547 100644 --- a/src/main/java/com/jmal/clouddisk/oss/FileInfo.java +++ b/src/main/java/com/jmal/clouddisk/oss/FileInfo.java @@ -1,12 +1,12 @@ package com.jmal.clouddisk.oss; import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.io.FileUtil; import com.jmal.clouddisk.model.FileDocument; import com.jmal.clouddisk.model.FileIntroVO; import com.jmal.clouddisk.oss.web.WebOssCommonService; import com.jmal.clouddisk.util.CaffeineUtil; import com.jmal.clouddisk.util.FileContentTypeUtils; +import com.jmal.clouddisk.util.MyFileUtils; import lombok.Data; import java.nio.file.Path; @@ -54,7 +54,7 @@ public FileIntroVO toFileIntroVO(String ossPath, String userId) { fileIntroVO.setName(fileName); fileIntroVO.setPath(WebOssCommonService.getPath(key, rootName)); fileIntroVO.setSize(size); - String suffix = FileUtil.extName(fileName); + String suffix = MyFileUtils.extName(fileName); fileIntroVO.setSuffix(suffix); fileIntroVO.setMd5(eTag); fileIntroVO.setContentType(FileContentTypeUtils.getContentType(suffix)); diff --git a/src/main/java/com/jmal/clouddisk/service/impl/CommonFileService.java b/src/main/java/com/jmal/clouddisk/service/impl/CommonFileService.java index 1acb3679..8cd24a6c 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/CommonFileService.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/CommonFileService.java @@ -302,7 +302,6 @@ public String createFile(String username, File file, String userId, Boolean isPu if (CaffeineUtil.hasUploadFileCache(file.getAbsolutePath())) { return null; } - log.info("createFile"); if (CharSequenceUtil.isBlank(username)) { return null; } @@ -313,7 +312,7 @@ public String createFile(String username, File file, String userId, Boolean isPu } } String fileName = file.getName(); - String suffix = FileUtil.extName(fileName); + String suffix = MyFileUtils.extName(fileName); String contentType = getContentType(file, FileContentTypeUtils.getContentType(suffix)); if (contentType.startsWith(Constants.CONTENT_TYPE_IMAGE)) { // 换成webp格式的图片 @@ -342,7 +341,7 @@ public String createFile(String username, File file, String userId, Boolean isPu Update update = new Update(); updateExifInfo(file, fileExists, contentType, suffix, update); updateVideoInfo(file, fileExists, contentType, update); - updateOtherInfo(fileExists, contentType, update); + updateOtherInfo(fileExists, contentType, suffix, update); if (!update.getUpdateObject().isEmpty()) { mongoTemplate.updateFirst(query, update, COLLECTION_NAME); } @@ -387,10 +386,13 @@ public String createFile(String username, File file, String userId, Boolean isPu return fileId; } - private void updateOtherInfo(FileDocument fileExists, String contentType, Update update) { + private void updateOtherInfo(FileDocument fileExists, String contentType, String suffix, Update update) { if (!contentType.equals(fileExists.getContentType())) { update.set(Constants.CONTENT_TYPE, contentType); } + if (StrUtil.isNotBlank(suffix) && !suffix.equals(fileExists.getSuffix())) { + update.set(Constants.SUFFIX, suffix); + } } private String getRelativePath(String username, String fileAbsolutePath, String fileName) { @@ -950,7 +952,7 @@ public void modifyFile(String username, File file) { query.addCriteria(Criteria.where("path").is(relativePath)); query.addCriteria(Criteria.where("name").is(fileName)); - String suffix = FileUtil.extName(fileName); + String suffix = MyFileUtils.extName(fileName); String contentType = FileContentTypeUtils.getContentType(suffix); // 文件是否存在 FileDocument fileDocument = mongoTemplate.findOne(query, FileDocument.class, COLLECTION_NAME); diff --git a/src/main/java/com/jmal/clouddisk/service/impl/FileServiceImpl.java b/src/main/java/com/jmal/clouddisk/service/impl/FileServiceImpl.java index 30a000fa..5b519366 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/FileServiceImpl.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/FileServiceImpl.java @@ -598,7 +598,7 @@ private static StreamingResponseBody getStreamingResponseBody(File file) { return outputStream -> { try (BufferedReader bufferedReader = ReaderFactory.createBufferedReader(file)) { // 判断file是否为log文件 - boolean logFile = file.length() > 0 && FileTypeUtil.getType(file).equals("log"); + boolean logFile = file.length() > 0 && FileTypeUtil.getType(file).equalsIgnoreCase("log"); String line; while ((line = bufferedReader.readLine()) != null) { if (logFile) { @@ -1153,7 +1153,7 @@ public ResponseResult unzip(String fileId, String destFileId) throws Com } else { if (fileId.equals(destFileId)) { // 解压到当前文件夹 - destDir = filePath.substring(0, filePath.length() - FileUtil.extName(new File(filePath)).length() - 1); + destDir = filePath.substring(0, filePath.length() - MyFileUtils.extName(new File(filePath)).length() - 1); } else { // 其他目录 FileDocument dest = getById(destFileId); @@ -1302,7 +1302,7 @@ public ResponseResult addFile(String fileName, Boolean isFolder, St fileIntroVO.setUserId(userId); fileIntroVO.setPath(resPath); fileIntroVO.setIsFolder(isFolder); - fileIntroVO.setSuffix(FileUtil.extName(fileName)); + fileIntroVO.setSuffix(MyFileUtils.extName(fileName)); String fileId = uploadFile(username, path.toFile()); fileIntroVO.setId(fileId); return ResultUtil.success(fileIntroVO); @@ -1417,7 +1417,7 @@ private List listFile(String username, String dirPath, boolean temp return Arrays.stream(fileList).map(file -> { FileIntroVO fileDocument = new FileIntroVO(); String filename = file.getName(); - String suffix = FileUtil.extName(filename); + String suffix = MyFileUtils.extName(filename); boolean isFolder = file.isDirectory(); fileDocument.setName(filename); fileDocument.setIsFolder(isFolder); @@ -1690,7 +1690,7 @@ private boolean renameFileError(String newFileName, String fileId, String filePa query.addCriteria(Criteria.where("_id").is(fileId)); Update update = new Update(); update.set("name", newFileName); - update.set(Constants.SUFFIX, FileUtil.extName(newFileName)); + update.set(Constants.SUFFIX, MyFileUtils.extName(newFileName)); update.set("updateDate", LocalDateTime.now(TimeUntils.ZONE_ID)); mongoTemplate.upsert(query, update, COLLECTION_NAME); } else { @@ -1734,7 +1734,7 @@ public ResponseResult upload(UploadApiParamDTO upload) throws IOExceptio // 保存文件信息 upload.setInputStream(file.getInputStream()); upload.setContentType(file.getContentType()); - upload.setSuffix(FileUtil.extName(filename)); + upload.setSuffix(MyFileUtils.extName(filename)); FileUtil.writeFromStream(file.getInputStream(), chunkFile); uploadFile(upload.getUsername(), chunkFile); uploadResponse.setUpload(true); diff --git a/src/main/java/com/jmal/clouddisk/service/impl/MarkdownServiceImpl.java b/src/main/java/com/jmal/clouddisk/service/impl/MarkdownServiceImpl.java index 91569885..23698bcd 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/MarkdownServiceImpl.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/MarkdownServiceImpl.java @@ -492,7 +492,7 @@ public ResponseResult editMarkdown(ArticleParamDTO upload) { String filename = upload.getFilename(); // 同步文档文件 String currentDirectory = syncDocFile(upload, uploadDate, fileDocument, filename); - fileDocument.setSuffix(FileUtil.extName(filename)); + fileDocument.setSuffix(MyFileUtils.extName(filename)); fileDocument.setUserId(upload.getUserId()); fileDocument.setUpdateDate(nowDate); fileDocument.setPath(currentDirectory); diff --git a/src/main/java/com/jmal/clouddisk/service/impl/SettingService.java b/src/main/java/com/jmal/clouddisk/service/impl/SettingService.java index b4ae2e1c..bca4e3a2 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/SettingService.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/SettingService.java @@ -12,6 +12,7 @@ import com.jmal.clouddisk.repository.IAuthDAO; import com.jmal.clouddisk.service.Constants; import com.jmal.clouddisk.util.MongoUtil; +import com.jmal.clouddisk.util.MyFileUtils; import com.jmal.clouddisk.util.ResponseResult; import com.jmal.clouddisk.util.ResultUtil; import lombok.extern.slf4j.Slf4j; @@ -71,7 +72,7 @@ public class SettingService { * @param file logo文件 */ public ResponseResult uploadLogo(MultipartFile file) { - String filename = "logo-" + System.currentTimeMillis() + "." + FileUtil.extName(file.getOriginalFilename()); + String filename = "logo-" + System.currentTimeMillis() + "." + MyFileUtils.extName(file.getOriginalFilename()); File dist = new File(fileProperties.getRootDir() + File.separator + filename); try { String oldFilename = null; diff --git a/src/main/java/com/jmal/clouddisk/util/FileFinderUtil.java b/src/main/java/com/jmal/clouddisk/util/FileFinderUtil.java deleted file mode 100644 index 53a59473..00000000 --- a/src/main/java/com/jmal/clouddisk/util/FileFinderUtil.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.jmal.clouddisk.util; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.text.CharSequenceUtil; - - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.BlockingDeque; -import java.util.concurrent.LinkedBlockingDeque; - -/** - * @Description 文件查找器 - * @Author jmal - * @Date 2020-03-01 13:06 - * @author jmal - */ -public class FileFinderUtil { - /** - * 查找文件。 - * - * 算法简述: - * 从某个给定的需查找的文件夹出发,搜索该文件夹的所有子文件夹及文件, - * 若为文件,则进行匹配,匹配成功则加入结果集,若为子文件夹,则进队列。 - * 队列不空,重复上述操作,队列为空,程序结束,返回结果。 - * - * @param baseDirName 待查找的目录 - * @param targetFileName 目标文件名,支持通配符形式 - * @param count 期望结果数目,如果畏0,则表示查找全部。 - * @return 满足查询条件的文件名列表 - */ - public static List findFiles(String baseDirName,String type, String targetFileName, int count) { - List fileList = new ArrayList<>(); - //判断目录是否存在 - File baseDir = new File(baseDirName); - if (!baseDir.exists() || !baseDir.isDirectory()){ - System.out.println("文件查找失败:" + baseDirName + "不是一个目录!"); - return fileList; - } - String tempName; - BlockingDeque queue = new LinkedBlockingDeque<>(); - //入队 - queue.add(baseDir); - File tempFile; - while (!queue.isEmpty()) { - //从队列中取目录 - tempFile = queue.pop(); - if (tempFile.exists() && tempFile.isDirectory()) { - File[] files = tempFile.listFiles(pathname -> { - if(CharSequenceUtil.isBlank(type)){ - return true; - } - if(pathname.isFile()){ - String contentType = FileContentTypeUtils.getContentType(FileUtil.extName(pathname)); - if(contentType.contains(type)){ - return true; - } - return false; - }else{ - return true; - } - }); - assert files != null; - for (File file : files) { - //如果是目录则放进队列 - if (file.isDirectory()) { - queue.add(file); - if(!CharSequenceUtil.isBlank(type)){ - continue; - } - } - tempName = file.getName(); - if (wildcardMatch(targetFileName, tempName)) { - //匹配成功,将文件名添加到结果集 - fileList.add(file.getAbsoluteFile()); - //如果已经达到指定的数目,则退出循环 - if ((count != 0) && (fileList.size() >= count)) { - return fileList; - } - } - } - } - } - - return fileList; - } - /** - * 通配符匹配 - * @param pattern 通配符模式 - * @param str 待匹配的字符串 - * @return 匹配成功则返回true,否则返回false - */ - private static boolean wildcardMatch(String pattern, String str) { - int patternLength = pattern.length(); - int strLength = str.length(); - int strIndex = 0; - char ch; - for (int patternIndex = 0; patternIndex < patternLength; patternIndex++) { - ch = pattern.charAt(patternIndex); - if (ch == '*') { - //通配符星号*表示可以匹配任意多个字符 - while (strIndex < strLength) { - if (wildcardMatch(pattern.substring(patternIndex + 1), - str.substring(strIndex))) { - return true; - } - strIndex++; - } - } else if (ch == '?') { - //通配符问号?表示匹配任意一个字符 - strIndex++; - if (strIndex > strLength) { - //表示str中已经没有字符匹配?了。 - return false; - } - } else { - if ((strIndex >= strLength) || (ch != str.charAt(strIndex))) { - return false; - } - strIndex++; - } - } - return (strIndex == strLength); - } -} diff --git a/src/main/java/com/jmal/clouddisk/util/MyFileUtils.java b/src/main/java/com/jmal/clouddisk/util/MyFileUtils.java index 96a646b0..0f4d790f 100644 --- a/src/main/java/com/jmal/clouddisk/util/MyFileUtils.java +++ b/src/main/java/com/jmal/clouddisk/util/MyFileUtils.java @@ -28,12 +28,24 @@ private MyFileUtils() { } + public static void main(String[] args) { + System.out.println(extName("file")); + } + + public static String extName(File file) { + return FileUtil.extName(file.getName()).toLowerCase(); + } + + public static String extName(String fileName) { + return FileUtil.extName(fileName).toLowerCase(); + } + public static boolean hasCharset(File file) { try { if (file == null) { return false; } - String suffix = FileUtil.extName(file.getName()); + String suffix = MyFileUtils.extName(file.getName()); String contentType = FileContentTypeUtils.getContentType(suffix); if (file.isDirectory()) { return false; @@ -103,7 +115,7 @@ public static boolean checkNoCacheFile(File file) { if (file.length() == 0) { return true; } - String type = FileTypeUtil.getType(file); + String type = FileTypeUtil.getType(file).toLowerCase(); if (hasContentFile(type)) return true; return hasCharset(file); } catch (Exception e) {