feat(oss): 实现基于MinIO的OSS文件服务功能

- 新增OssServiceImpl类,实现文件上传、读取、删除等接口
- 集成MinIO客户端,确保存储桶存在并支持文件操作
- 实现文件上传后保存附件元数据至数据库
- 支持通过URL获取文件输入流和读取文件内容
- 提供生成文件访问URL的方法
- 新增FileAttachment实体类,映射文件附件表结构
- 创建FileAttachmentMapper接口,支持文件附件数据库操作
This commit is contained in:
2026-03-27 10:39:52 +08:00
parent 294ef21d50
commit d49bc443ce
3 changed files with 146 additions and 2 deletions

View File

@@ -2,6 +2,8 @@ package cn.yinlihupo.service.oss.impl;
import cn.yinlihupo.common.config.MinioConfig;
import cn.yinlihupo.common.util.DocumentParserUtil;
import cn.yinlihupo.domain.entity.FileAttachment;
import cn.yinlihupo.mapper.FileAttachmentMapper;
import cn.yinlihupo.service.oss.OssService;
import io.minio.*;
import io.minio.errors.*;
@@ -25,6 +27,7 @@ public class OssServiceImpl implements OssService {
private final MinioClient minioClient;
private final MinioConfig minioConfig;
private final FileAttachmentMapper fileAttachmentMapper;
@Override
public String uploadFile(MultipartFile file, String fileName) {
@@ -52,14 +55,48 @@ public class OssServiceImpl implements OssService {
log.info("文件上传成功: {}/{}", bucketName, objectName);
// 返回文件URL
return getFileUrl(bucketName, objectName);
// 构建文件URL
String fileUrl = getFileUrl(bucketName, objectName);
// 保存文件附件记录
saveFileAttachment(file, fileName, bucketName, objectName, fileUrl);
return fileUrl;
} catch (Exception e) {
log.error("文件上传失败: {}", e.getMessage(), e);
throw new RuntimeException("文件上传失败: " + e.getMessage(), e);
}
}
/**
* 保存文件附件记录到数据库
*
* @param file 上传的文件
* @param fileName 原始文件名
* @param bucketName 存储桶名称
* @param objectName 对象名称
* @param fileUrl 文件URL
*/
private void saveFileAttachment(MultipartFile file, String fileName, String bucketName,
String objectName, String fileUrl) {
try {
FileAttachment attachment = new FileAttachment();
attachment.setFileName(objectName);
attachment.setOriginalName(fileName);
attachment.setFilePath(bucketName + "/" + objectName);
attachment.setFileUrl(fileUrl);
attachment.setFileType(file.getContentType());
attachment.setFileSize(file.getSize());
attachment.setStorageType("minio");
fileAttachmentMapper.insert(attachment);
log.info("文件附件记录保存成功, fileName: {}", fileName);
} catch (Exception e) {
log.error("保存文件附件记录失败: {}", e.getMessage(), e);
// 不影响主流程,仅记录日志
}
}
@Override
public String readFileAsString(String fileUrl) {
try (InputStream inputStream = getFileInputStream(fileUrl)) {