feat(storage): 集成 MinIO 对象存储替代本地文件系统
- 添加 MinIO 配置类 MinioConfig 和服务类 MinioService - 在 CommonController 中实现 MinIO 上传下载功能 - 在 FileUploadController 中集成 MinIO 上传支持 - 在 SysProfileController 中添加头像上传到 MinIO 的逻辑 - 修改文件上传工具类支持 MinIO 上传 - 添加 MinIO 相关依赖到项目配置 - 实现本地文件系统与 MinIO 的条件切换机制
This commit is contained in:
@@ -13,12 +13,15 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import com.ruoyi.common.config.MinioConfig;
|
||||
import com.ruoyi.common.config.RuoYiConfig;
|
||||
import com.ruoyi.common.constant.Constants;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.file.FileUploadUtils;
|
||||
import com.ruoyi.common.utils.file.FileUtils;
|
||||
import com.ruoyi.common.utils.file.MimeTypeUtils;
|
||||
import com.ruoyi.common.utils.file.MinioService;
|
||||
import com.ruoyi.framework.config.ServerConfig;
|
||||
|
||||
/**
|
||||
@@ -35,6 +38,12 @@ public class CommonController
|
||||
@Autowired
|
||||
private ServerConfig serverConfig;
|
||||
|
||||
@Autowired(required = false)
|
||||
private MinioService minioService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private MinioConfig minioConfig;
|
||||
|
||||
private static final String FILE_DELIMETER = ",";
|
||||
|
||||
/**
|
||||
@@ -53,14 +62,30 @@ public class CommonController
|
||||
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
|
||||
}
|
||||
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
|
||||
String filePath = RuoYiConfig.getDownloadPath() + fileName;
|
||||
|
||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||
FileUtils.setAttachmentResponseHeader(response, realFileName);
|
||||
FileUtils.writeBytes(filePath, response.getOutputStream());
|
||||
if (delete)
|
||||
if (isMinioEnabled())
|
||||
{
|
||||
FileUtils.deleteFile(filePath);
|
||||
// MinIO 下载
|
||||
String objectName = "download/" + fileName;
|
||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||
FileUtils.setAttachmentResponseHeader(response, realFileName);
|
||||
minioService.download(objectName, response.getOutputStream());
|
||||
if (delete)
|
||||
{
|
||||
minioService.delete(objectName);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 本地文件系统下载
|
||||
String filePath = RuoYiConfig.getDownloadPath() + fileName;
|
||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||
FileUtils.setAttachmentResponseHeader(response, realFileName);
|
||||
FileUtils.writeBytes(filePath, response.getOutputStream());
|
||||
if (delete)
|
||||
{
|
||||
FileUtils.deleteFile(filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -77,16 +102,28 @@ public class CommonController
|
||||
{
|
||||
try
|
||||
{
|
||||
// 上传文件路径
|
||||
String filePath = RuoYiConfig.getUploadPath();
|
||||
// 上传并返回新文件名称
|
||||
String fileName = FileUploadUtils.upload(filePath, file);
|
||||
String url = serverConfig.getUrl() + fileName;
|
||||
AjaxResult ajax = AjaxResult.success();
|
||||
ajax.put("url", url);
|
||||
ajax.put("fileName", fileName);
|
||||
ajax.put("newFileName", FileUtils.getName(fileName));
|
||||
ajax.put("originalFilename", file.getOriginalFilename());
|
||||
|
||||
if (isMinioEnabled())
|
||||
{
|
||||
// MinIO 上传
|
||||
String url = FileUploadUtils.uploadToMinio(minioService, "upload", file,
|
||||
MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
|
||||
ajax.put("url", url);
|
||||
ajax.put("fileName", url);
|
||||
ajax.put("newFileName", FileUtils.getName(file.getOriginalFilename()));
|
||||
}
|
||||
else
|
||||
{
|
||||
// 本地文件系统上传
|
||||
String filePath = RuoYiConfig.getUploadPath();
|
||||
String fileName = FileUploadUtils.upload(filePath, file);
|
||||
String url = serverConfig.getUrl() + fileName;
|
||||
ajax.put("url", url);
|
||||
ajax.put("fileName", fileName);
|
||||
ajax.put("newFileName", FileUtils.getName(fileName));
|
||||
}
|
||||
return ajax;
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -103,22 +140,39 @@ public class CommonController
|
||||
{
|
||||
try
|
||||
{
|
||||
// 上传文件路径
|
||||
String filePath = RuoYiConfig.getUploadPath();
|
||||
List<String> urls = new ArrayList<String>();
|
||||
List<String> fileNames = new ArrayList<String>();
|
||||
List<String> newFileNames = new ArrayList<String>();
|
||||
List<String> originalFilenames = new ArrayList<String>();
|
||||
for (MultipartFile file : files)
|
||||
|
||||
if (isMinioEnabled())
|
||||
{
|
||||
// 上传并返回新文件名称
|
||||
String fileName = FileUploadUtils.upload(filePath, file);
|
||||
String url = serverConfig.getUrl() + fileName;
|
||||
urls.add(url);
|
||||
fileNames.add(fileName);
|
||||
newFileNames.add(FileUtils.getName(fileName));
|
||||
originalFilenames.add(file.getOriginalFilename());
|
||||
// MinIO 上传
|
||||
for (MultipartFile file : files)
|
||||
{
|
||||
String url = FileUploadUtils.uploadToMinio(minioService, "upload", file,
|
||||
MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
|
||||
urls.add(url);
|
||||
fileNames.add(url);
|
||||
newFileNames.add(FileUtils.getName(file.getOriginalFilename()));
|
||||
originalFilenames.add(file.getOriginalFilename());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 本地文件系统上传
|
||||
String filePath = RuoYiConfig.getUploadPath();
|
||||
for (MultipartFile file : files)
|
||||
{
|
||||
String fileName = FileUploadUtils.upload(filePath, file);
|
||||
String url = serverConfig.getUrl() + fileName;
|
||||
urls.add(url);
|
||||
fileNames.add(fileName);
|
||||
newFileNames.add(FileUtils.getName(fileName));
|
||||
originalFilenames.add(file.getOriginalFilename());
|
||||
}
|
||||
}
|
||||
|
||||
AjaxResult ajax = AjaxResult.success();
|
||||
ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
|
||||
ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
|
||||
@@ -160,4 +214,12 @@ public class CommonController
|
||||
log.error("下载文件失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断 MinIO 是否启用
|
||||
*/
|
||||
private boolean isMinioEnabled()
|
||||
{
|
||||
return minioService != null && minioConfig != null && minioConfig.isEnabled();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
package com.ruoyi.web.controller.common;
|
||||
|
||||
import com.ruoyi.common.annotation.Anonymous;
|
||||
import com.ruoyi.common.config.MinioConfig;
|
||||
import com.ruoyi.common.config.RuoYiConfig;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.common.exception.NonCaptureException;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.file.FileUploadUtils;
|
||||
import com.ruoyi.common.utils.file.FileUtils;
|
||||
import com.ruoyi.common.utils.file.MimeTypeUtils;
|
||||
import com.ruoyi.common.utils.file.MinioService;
|
||||
import com.ruoyi.framework.config.ServerConfig;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -25,26 +28,53 @@ public class FileUploadController {
|
||||
@Autowired
|
||||
private ServerConfig serverConfig;
|
||||
|
||||
@Autowired(required = false)
|
||||
private MinioService minioService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private MinioConfig minioConfig;
|
||||
|
||||
@Anonymous
|
||||
@PostMapping("/upload")
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public AjaxResult uploadFile(MultipartFile file) {
|
||||
try {
|
||||
log.info("文件 {} 上传中...", file.getOriginalFilename());
|
||||
// 上传文件路径
|
||||
String filePath = RuoYiConfig.getUploadPath();
|
||||
// 上传并返回新文件名称
|
||||
String fileName = FileUploadUtils.upload(filePath, file);
|
||||
String url = serverConfig.getUrl() + fileName;
|
||||
AjaxResult ajax = AjaxResult.success();
|
||||
ajax.put("url", url);
|
||||
ajax.put("fileName", fileName);
|
||||
ajax.put("newFileName", FileUtils.getName(fileName));
|
||||
ajax.put("originalFilename", file.getOriginalFilename());
|
||||
|
||||
if (isMinioEnabled())
|
||||
{
|
||||
// MinIO 上传
|
||||
String url = FileUploadUtils.uploadToMinio(minioService, "upload", file,
|
||||
MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
|
||||
ajax.put("url", url);
|
||||
ajax.put("fileName", url);
|
||||
ajax.put("newFileName", FileUtils.getName(file.getOriginalFilename()));
|
||||
}
|
||||
else
|
||||
{
|
||||
// 本地文件系统上传
|
||||
String filePath = RuoYiConfig.getUploadPath();
|
||||
String fileName = FileUploadUtils.upload(filePath, file);
|
||||
String url = serverConfig.getUrl() + fileName;
|
||||
ajax.put("url", url);
|
||||
ajax.put("fileName", fileName);
|
||||
ajax.put("newFileName", FileUtils.getName(fileName));
|
||||
}
|
||||
|
||||
log.info("文件 {} 上传成功!", file.getOriginalFilename());
|
||||
return ajax;
|
||||
} catch (Exception e) {
|
||||
throw new NonCaptureException(StringUtils.format("文件 {} 上传失败!", file.getOriginalFilename()), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断 MinIO 是否启用
|
||||
*/
|
||||
private boolean isMinioEnabled()
|
||||
{
|
||||
return minioService != null && minioConfig != null && minioConfig.isEnabled();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import com.ruoyi.common.annotation.Log;
|
||||
import com.ruoyi.common.config.MinioConfig;
|
||||
import com.ruoyi.common.config.RuoYiConfig;
|
||||
import com.ruoyi.common.core.controller.BaseController;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
@@ -21,6 +22,7 @@ import com.ruoyi.common.utils.SecurityUtils;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.file.FileUploadUtils;
|
||||
import com.ruoyi.common.utils.file.MimeTypeUtils;
|
||||
import com.ruoyi.common.utils.file.MinioService;
|
||||
import com.ruoyi.framework.web.service.TokenService;
|
||||
import com.ruoyi.system.service.ISysUserService;
|
||||
|
||||
@@ -39,6 +41,12 @@ public class SysProfileController extends BaseController
|
||||
@Autowired
|
||||
private TokenService tokenService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private MinioService minioService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private MinioConfig minioConfig;
|
||||
|
||||
/**
|
||||
* 个人信息
|
||||
*/
|
||||
@@ -124,7 +132,15 @@ public class SysProfileController extends BaseController
|
||||
if (!file.isEmpty())
|
||||
{
|
||||
LoginUser loginUser = getLoginUser();
|
||||
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
|
||||
String avatar;
|
||||
if (isMinioEnabled())
|
||||
{
|
||||
avatar = FileUploadUtils.uploadToMinio(minioService, "avatar", file, MimeTypeUtils.IMAGE_EXTENSION);
|
||||
}
|
||||
else
|
||||
{
|
||||
avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
|
||||
}
|
||||
if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
|
||||
{
|
||||
AjaxResult ajax = AjaxResult.success();
|
||||
@@ -137,4 +153,12 @@ public class SysProfileController extends BaseController
|
||||
}
|
||||
return error("上传图片异常,请联系管理员");
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断 MinIO 是否启用
|
||||
*/
|
||||
private boolean isMinioEnabled()
|
||||
{
|
||||
return minioService != null && minioConfig != null && minioConfig.isEnabled();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user