diff --git a/README.md b/README.md index 90af76a54c27fc1ad8c5c544ffe8ee7780077659..6af42ed8588652fe834f8274892a257c074ed1f0 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ com.github.wb04307201 file-preview-spring-boot-starter - 1.2.7 + 1.2.8 ``` diff --git a/pom.xml b/pom.xml index 96b479904562a72aa341be8ad97b76f9dd2c054c..622bf5780383a46425c15fa7442f272dc5178620 100644 --- a/pom.xml +++ b/pom.xml @@ -18,14 +18,14 @@ org.springframework.boot spring-boot-dependencies - 3.2.5 + 3.3.1 pom import org.projectlombok lombok - 1.18.32 + 1.18.34 ch.qos.logback @@ -61,7 +61,7 @@ org.apache.commons commons-compress - 1.26.1 + 1.26.2 @@ -119,6 +119,12 @@ io.fusionauth fusionauth-jwt + + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/src/main/java/cn/wubo/file/preview/core/FilePreviewService.java b/src/main/java/cn/wubo/file/preview/core/FilePreviewService.java index 2782dfdfc834a0728cf7728a5dd03bd602ddd66b..6f5b56889f332f38c7010d05aa8b2353700bc45c 100644 --- a/src/main/java/cn/wubo/file/preview/core/FilePreviewService.java +++ b/src/main/java/cn/wubo/file/preview/core/FilePreviewService.java @@ -1,5 +1,6 @@ package cn.wubo.file.preview.core; +import cn.wubo.file.preview.exception.PreviewRuntimeException; import cn.wubo.file.preview.office.IOfficeConverter; import cn.wubo.file.preview.record.IFilePreviewRecord; import cn.wubo.file.preview.storage.IFileStorage; @@ -34,27 +35,38 @@ public class FilePreviewService { } /** - * 将输入流中的文件转换为预览信息。 + * 转换输入流中的文件内容,生成预览信息。 + * 该方法接收一个输入流和文件名,通过officeConverter将文件内容转换为新的格式, + * 并保存转换后的文件,最后返回包含预览信息的对象。 * - * @param is 输入流,代表待转换的文件。 - * @param fileName 原文件名称。 - * @return FilePreviewInfo 文件预览信息对象,包含转换后的文件存储信息和记录。 + * @param is 输入流,代表待转换的文件内容。 + * @param fileName 原文件名。 + * @return 返回包含转换后文件名、文件路径、原文件名和创建时间的文件预览信息对象。 */ public FilePreviewInfo covert(InputStream is, String fileName) { - // 转换文件 + // 用于存储转换后的文件字节内容 byte[] bytes; + // 存储转换后的新文件名 String newFileName; + try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { + // 使用officeConverter进行文件转换,同时获取新文件名 newFileName = officeConverter.convert(is, os, fileName); + // 将转换后的文件内容保存到字节数组中 bytes = os.toByteArray(); } - // 存储转换后的文件 - FilePreviewInfo filePreviewInfo = fileStorage.save(bytes, newFileName); - - // 保存文件预览记录 + // 创建文件预览信息对象 + FilePreviewInfo filePreviewInfo = new FilePreviewInfo(); + // 设置新文件名 + filePreviewInfo.setFileName(newFileName); + // 保存转换后的文件到文件存储系统,并获取保存后的文件路径 + filePreviewInfo.setFilePath(fileStorage.save(bytes, newFileName)); + // 设置原文件名 filePreviewInfo.setOriginalFilename(fileName); + // 设置文件的创建时间 filePreviewInfo.setCreateTime(new Date()); + // 将文件预览信息保存到数据库,并返回保存后的对象 filePreviewInfo = filePreviewRecord.save(filePreviewInfo); return filePreviewInfo; } @@ -80,7 +92,7 @@ public class FilePreviewService { // 根据ID查找文件预览信息 FilePreviewInfo filePreviewInfo = filePreviewRecord.findById(id); // 尝试删除文件及其预览信息,并返回操作结果 - return fileStorage.delete(filePreviewInfo) && filePreviewRecord.delete(filePreviewInfo); + return fileStorage.delete(filePreviewInfo.getFilePath()) && filePreviewRecord.delete(filePreviewInfo); } /** @@ -102,8 +114,7 @@ public class FilePreviewService { // 设置原始文件名,如果压缩文件名中还包含"@",则取到最后一个"@"为止的字符串,且去除路径部分 String subFileName = compressFileName.contains("@") ? compressFileName.substring(0, compressFileName.lastIndexOf("@") + 1) : compressFileName; - if (subFileName.contains("/")) - subFileName = subFileName.substring(subFileName.lastIndexOf("/") + 1); + if (subFileName.contains("/")) subFileName = subFileName.substring(subFileName.lastIndexOf("/") + 1); filePreviewInfo.setOriginalFilename(subFileName); filePreviewInfo.setFileName(subFileName); } else { @@ -128,7 +139,7 @@ public class FilePreviewService { try { FilePreviewInfo compressFilePreviewInfo = findById(filePreviewInfo.getId()); // 首先将文件从存储服务中读取出来,然后写入到临时文件 - Path path = FileUtils.writeTempFile(compressFilePreviewInfo.getFileName(), fileStorage.getBytes(compressFilePreviewInfo)); + Path path = FileUtils.writeTempFile(compressFilePreviewInfo.getFileName(), fileStorage.getBytes(compressFilePreviewInfo.getFilePath())); // 对临时文件进行解压,获取最终需要的文件 for (String compressFileName : compressFileNames) path = FileUtils.getSubCompressFile(path, compressFileName); @@ -136,11 +147,11 @@ public class FilePreviewService { return IoUtils.toByteArray(new BufferedInputStream(Files.newInputStream(path))); } catch (IOException | ArchiveException e) { // 如果处理过程中出现异常,则抛出运行时异常 - throw new RuntimeException(e); + throw new PreviewRuntimeException(e.getMessage(), e); } } else { // 如果没有压缩文件名,则直接通过文件存储服务获取指定文件预览信息对应的字节码 - return fileStorage.getBytes(filePreviewInfo); + return fileStorage.getBytes(filePreviewInfo.getFilePath()); } } } diff --git a/src/main/java/cn/wubo/file/preview/page/PageFactory.java b/src/main/java/cn/wubo/file/preview/page/PageFactory.java index 45fa33890340b2685555d3fb1695dbe5ab447c81..411d1231b71401f9a3f5219aefbf2f962dbc8de8 100644 --- a/src/main/java/cn/wubo/file/preview/page/PageFactory.java +++ b/src/main/java/cn/wubo/file/preview/page/PageFactory.java @@ -4,7 +4,6 @@ import cn.wubo.file.preview.config.FilePreviewProperties; import cn.wubo.file.preview.core.FilePreviewInfo; import cn.wubo.file.preview.core.FilePreviewService; import cn.wubo.file.preview.exception.PageRuntimeException; -import cn.wubo.file.preview.page.impl.PdfPage; import cn.wubo.file.preview.utils.FileUtils; import java.lang.reflect.InvocationTargetException; diff --git a/src/main/java/cn/wubo/file/preview/storage/IFileStorage.java b/src/main/java/cn/wubo/file/preview/storage/IFileStorage.java index 0401b47369af07bafaba61687b5a249dc24b9cd9..8b43cf30cfa413762027f4fe8f5b47f7eb82d66b 100644 --- a/src/main/java/cn/wubo/file/preview/storage/IFileStorage.java +++ b/src/main/java/cn/wubo/file/preview/storage/IFileStorage.java @@ -1,7 +1,5 @@ package cn.wubo.file.preview.storage; -import cn.wubo.file.preview.core.FilePreviewInfo; - public interface IFileStorage { /** @@ -10,21 +8,21 @@ public interface IFileStorage { * @param fileName * @return */ - FilePreviewInfo save(byte[] bytes, String fileName); + String save(byte[] bytes, String fileName); /** * 删除文件 - * @param filePreviewInfo + * @param path * @return */ - Boolean delete(FilePreviewInfo filePreviewInfo); + Boolean delete(String path); /** * 获取文件bytes - * @param filePreviewInfo + * @param path * @return */ - byte[] getBytes(FilePreviewInfo filePreviewInfo); + byte[] getBytes(String path); /** * 初始化 diff --git a/src/main/java/cn/wubo/file/preview/storage/impl/LocalFileStorageImpl.java b/src/main/java/cn/wubo/file/preview/storage/impl/LocalFileStorageImpl.java index 859ab1ab3a98b0c9c89bd67a48131e0b6d7a7476..e5211811f69b9d15753dbb0d46c100f0c5808acd 100644 --- a/src/main/java/cn/wubo/file/preview/storage/impl/LocalFileStorageImpl.java +++ b/src/main/java/cn/wubo/file/preview/storage/impl/LocalFileStorageImpl.java @@ -1,6 +1,5 @@ package cn.wubo.file.preview.storage.impl; -import cn.wubo.file.preview.core.FilePreviewInfo; import cn.wubo.file.preview.exception.StorageRuntimeException; import cn.wubo.file.preview.storage.IFileStorage; @@ -14,26 +13,22 @@ public class LocalFileStorageImpl implements IFileStorage { private String basePath = "temp"; @Override - public FilePreviewInfo save(byte[] bytes, String fileName) { - FilePreviewInfo filePreviewInfo = new FilePreviewInfo(); - filePreviewInfo.setFileName(fileName); - + public String save(byte[] bytes, String fileName) { Path filePath = Paths.get(basePath, fileName); - filePreviewInfo.setFilePath(filePath.toString()); try { Files.createDirectories(filePath.getParent()); if (Files.exists(filePath)) Files.delete(filePath); Files.createFile(filePath); Files.write(filePath, bytes); - return filePreviewInfo; + return filePath.toString(); } catch (IOException e) { throw new StorageRuntimeException(e.getMessage(), e); } } @Override - public Boolean delete(FilePreviewInfo filePreviewInfo) { - Path filePath = Paths.get(filePreviewInfo.getFilePath()); + public Boolean delete(String path) { + Path filePath = Paths.get(path); try { Files.delete(filePath); } catch (IOException e) { @@ -43,9 +38,9 @@ public class LocalFileStorageImpl implements IFileStorage { } @Override - public byte[] getBytes(FilePreviewInfo filePreviewInfo) { + public byte[] getBytes(String path) { try { - return Files.readAllBytes(Paths.get(filePreviewInfo.getFilePath())); + return Files.readAllBytes(Paths.get(path)); } catch (IOException e) { throw new StorageRuntimeException(e.getMessage(), e); }