From e356368b62def8e7434e4b7b8acfccc74e2349b6 Mon Sep 17 00:00:00 2001
From: ybb <2532447764@qq.com>
Date: Thu, 7 Aug 2025 16:06:15 +0800
Subject: [PATCH] =?UTF-8?q?8/7,ybb=E6=96=87=E4=BB=B6=E5=A4=B9=E5=92=8C?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E9=83=BD=E5=AE=9E=E7=8E=B0=E4=BA=86=E8=AE=B0?=
=?UTF-8?q?=E5=BD=95Id=E5=8A=9F=E8=83=BD=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
core/pom.xml | 7 +
.../domain/entity/BusinessDataFileEntity.java | 2 +
.../znpt/mapper/BusinessDataFileMapper.java | 4 +
.../dite/znpt/mapper/BusinessDataMapper.java | 5 +-
.../znpt/service/BusinessDataFileService.java | 4 +-
.../impl/BusinessDataFileServiceImpl.java | 246 +++++++++++++++++-
.../BusinessDataFileController.java | 7 +
web/src/main/resources/application.yml | 6 +-
8 files changed, 271 insertions(+), 10 deletions(-)
diff --git a/core/pom.xml b/core/pom.xml
index 94afd03..599d2b6 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -161,6 +161,13 @@
opencv
4.7.0-0
+
+
+
+ commons-io
+ commons-io
+ 2.11.0
+
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java
index 9fc787f..8daf3cf 100644
--- a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java
+++ b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java
@@ -33,5 +33,7 @@ public class BusinessDataFileEntity {
private String uploaderId = null;
//是否删除
private Boolean isDeleted = false;
+// //有效日期
+// private Date validDate = null;
}
diff --git a/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java b/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java
index 0420931..73e7191 100644
--- a/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java
+++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java
@@ -11,6 +11,10 @@ import java.util.List;
@ApiOperation("商务资料文件对象")
public interface BusinessDataFileMapper {
+
+ // 新增文件预览方法
+
+
public List List(@Param("folderId") Long folderId, @Param("fileName") String fileName);
void delete(@Param("fileId") Long fileId,@Param("folderId") Long folderId);
diff --git a/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java b/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java
index 9d1d686..b7e4bae 100644
--- a/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java
+++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java
@@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.core.injector.methods.SelectList;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dite.znpt.domain.entity.BusinessDataEntity;
import io.swagger.annotations.ApiOperation;
+import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
-import com.dite.znpt.domain.entity.BusinessDataEntity;
import java.time.LocalDateTime;
import java.util.List;
@@ -16,7 +16,8 @@ import java.util.List;
@ApiOperation("商务资料文件夹对象")
-public interface BusinessDataMapper {
+@Mapper
+public interface BusinessDataMapper {
public String getPath(Long parentId);
public List List();
diff --git a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java
index a5d995d..7cb636f 100644
--- a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java
+++ b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java
@@ -36,6 +36,6 @@ public interface BusinessDataFileService {
@ApiOperation("上传文件")
Result addfile(MultipartFile file, Long folderId);
- // 在接口中添加预览方法
-// Result preview(Long fileId, HttpServletResponse response);
+ @ApiOperation("预览文件")
+ Result preview(Long fileId, HttpServletResponse response);
}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java
index 95b343c..cda9ef8 100644
--- a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java
+++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java
@@ -1,7 +1,22 @@
package com.dite.znpt.service.impl;
-
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileInputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.springframework.util.MimeTypeUtils;
+import org.springframework.http.MediaType;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import java.util.Base64;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+//
import cn.dev33.satoken.stp.StpUtil;
import com.dite.znpt.domain.Result;
import com.dite.znpt.domain.entity.BusinessDataFileEntity;
@@ -82,8 +97,6 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService {
return Result.okM("删除成功");
}
}
-
-
}
@ApiOperation("增加文件")
@@ -239,4 +252,231 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService {
return Result.error("上传失败");
}
}
+
+
+ @ApiOperation("文件预览")
+ public Result preview(Long fileId, HttpServletResponse response) {
+ try {
+ // 获取文件路径
+ String filePath = businessDataFileMapper.getPath(fileId);
+ if (filePath == null || filePath.isEmpty()) {
+ return Result.error("文件不存在");
+ }
+
+ File file = new File(filePath);
+ if (!file.exists()) {
+ return Result.error("文件不存在");
+ }
+
+ // 获取文件扩展名
+ String extension = getFileExtension(filePath);
+
+ // 根据文件类型处理预览
+ switch (extension) {
+ case "pdf":
+ return previewPdf(file, response);
+ case "jpg":
+ case "jpeg":
+ case "png":
+ case "gif":
+ case "bmp":
+ case "webp":
+ return previewImage(file, response);
+ case "txt":
+ case "md":
+ case "log":
+ return previewText(file, response);
+ case "doc":
+ case "docx":
+ case "xls":
+ case "xlsx":
+ case "ppt":
+ case "pptx":
+ return previewOffice(file, response);
+ case "mp4":
+ case "avi":
+ case "mov":
+ case "wmv":
+ case "flv":
+ return previewVideo(file, response);
+ case "mp3":
+ case "wav":
+ case "flac":
+ case "aac":
+ return previewAudio(file, response);
+ default:
+ return Result.error("暂不支持该文件类型的预览");
+ }
+ } catch (Exception e) {
+ return Result.error("文件预览失败: " + e.getMessage());
+ }
+ }
+
+ private String getFileExtension(String fileName) {
+ if (fileName == null || fileName.isEmpty()) {
+ return "";
+ }
+ int lastDotIndex = fileName.lastIndexOf('.');
+ if (lastDotIndex == -1) {
+ return "";
+ }
+ return fileName.substring(lastDotIndex + 1).toLowerCase();
+ }
+
+ private Result previewPdf(File file, HttpServletResponse response) {
+ try {
+ response.setContentType("application/pdf");
+ response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
+
+ try (FileInputStream fis = new FileInputStream(file);
+ OutputStream os = response.getOutputStream()) {
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = fis.read(buffer)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ }
+ return Result.ok("PDF预览成功");
+ } catch (Exception e) {
+ return Result.error("PDF预览失败: " + e.getMessage());
+ }
+ }
+
+ private Result previewImage(File file, HttpServletResponse response) {
+ try {
+ String contentType = getImageContentType(file.getName());
+ response.setContentType(contentType);
+ response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
+
+ try (FileInputStream fis = new FileInputStream(file);
+ OutputStream os = response.getOutputStream()) {
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = fis.read(buffer)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ }
+ return Result.ok("图片预览成功");
+ } catch (Exception e) {
+ return Result.error("图片预览失败: " + e.getMessage());
+ }
+ }
+
+ private Result previewText(File file, HttpServletResponse response) {
+ try {
+ response.setContentType("text/plain; charset=UTF-8");
+ response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
+
+ try (FileInputStream fis = new FileInputStream(file);
+ OutputStream os = response.getOutputStream()) {
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = fis.read(buffer)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ }
+ return Result.ok("文本预览成功");
+ } catch (Exception e) {
+ return Result.error("文本预览失败: " + e.getMessage());
+ }
+ }
+
+ private Result previewOffice(File file, HttpServletResponse response) {
+ // Office文件预览比较复杂,这里返回提示信息
+ return Result.error("Office文件预览功能暂未实现,请下载后查看");
+ }
+
+ private Result previewVideo(File file, HttpServletResponse response) {
+ try {
+ String contentType = getVideoContentType(file.getName());
+ response.setContentType(contentType);
+ response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
+
+ try (FileInputStream fis = new FileInputStream(file);
+ OutputStream os = response.getOutputStream()) {
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = fis.read(buffer)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ }
+ return Result.ok("视频预览成功");
+ } catch (Exception e) {
+ return Result.error("视频预览失败: " + e.getMessage());
+ }
+ }
+
+ private Result previewAudio(File file, HttpServletResponse response) {
+ try {
+ String contentType = getAudioContentType(file.getName());
+ response.setContentType(contentType);
+ response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
+
+ try (FileInputStream fis = new FileInputStream(file);
+ OutputStream os = response.getOutputStream()) {
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = fis.read(buffer)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ }
+ return Result.ok("音频预览成功");
+ } catch (Exception e) {
+ return Result.error("音频预览失败: " + e.getMessage());
+ }
+ }
+
+ private String getImageContentType(String fileName) {
+ String extension = getFileExtension(fileName);
+ switch (extension) {
+ case "jpg":
+ case "jpeg":
+ return "image/jpeg";
+ case "png":
+ return "image/png";
+ case "gif":
+ return "image/gif";
+ case "bmp":
+ return "image/bmp";
+ case "webp":
+ return "image/webp";
+ default:
+ return "application/octet-stream";
+ }
+ }
+
+ private String getVideoContentType(String fileName) {
+ String extension = getFileExtension(fileName);
+ switch (extension) {
+ case "mp4":
+ return "video/mp4";
+ case "avi":
+ return "video/x-msvideo";
+ case "mov":
+ return "video/quicktime";
+ case "wmv":
+ return "video/x-ms-wmv";
+ case "flv":
+ return "video/x-flv";
+ default:
+ return "application/octet-stream";
+ }
+ }
+
+ private String getAudioContentType(String fileName) {
+ String extension = getFileExtension(fileName);
+ switch (extension) {
+ case "mp3":
+ return "audio/mpeg";
+ case "wav":
+ return "audio/wav";
+ case "flac":
+ return "audio/flac";
+ case "aac":
+ return "audio/aac";
+ default:
+ return "application/octet-stream";
+ }
+ }
+
}
diff --git a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java
index eb647e7..f42b8fa 100644
--- a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java
+++ b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java
@@ -27,6 +27,7 @@ import org.springframework.web.multipart.MultipartFile;
/*
* @Description: 商务资料管理,文件夹层
+ * 袁彬彬写的,其他人合并的时候,不允许改我的部分。
*/
@Api(tags = "文件接口")
@@ -78,4 +79,10 @@ public class BusinessDataFileController {
return businessDataFileService.reName(fileId, newFileName);
}
+ @ApiOperation(value = "文件预览")
+ @GetMapping("/preview")
+ public Result preview(@RequestParam("fileId") Long fileId, HttpServletResponse response) {
+ return businessDataFileService.preview(fileId, response);
+ }
+
}
diff --git a/web/src/main/resources/application.yml b/web/src/main/resources/application.yml
index 694c057..11a5b40 100644
--- a/web/src/main/resources/application.yml
+++ b/web/src/main/resources/application.yml
@@ -10,9 +10,9 @@ spring:
servlet:
multipart:
# 单个文件大小
- max-file-size: 100MB
+ max-file-size: 1000MB
# 设置总上传的文件大小
- max-request-size: 200MB
+ max-request-size: 2000MB
application:
name: znpt
mvc:
@@ -27,4 +27,4 @@ flowable:
# true 会对数据库中所有表进行更新操作。如果表不存在,则自动创建(建议开发时使用)
database-schema-update: false
# 关闭定时任务JOB
- async-executor-activate: false
\ No newline at end of file
+ async-executor-activate: false