88 lines
3.2 KiB
Java
88 lines
3.2 KiB
Java
package com.aida.seller.module.file;
|
||
|
||
import cn.hutool.crypto.digest.DigestUtil;
|
||
import com.aida.seller.common.constants.CommonConstants;
|
||
import com.aida.seller.common.context.UserContext;
|
||
import com.aida.seller.common.exception.BusinessException;
|
||
import com.aida.seller.common.result.Response;
|
||
import com.aida.seller.util.MinioUtil;
|
||
import io.swagger.v3.oas.annotations.Operation;
|
||
import io.swagger.v3.oas.annotations.Parameter;
|
||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||
import lombok.RequiredArgsConstructor;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.beans.factory.annotation.Value;
|
||
import org.springframework.web.bind.annotation.*;
|
||
import org.springframework.web.multipart.MultipartFile;
|
||
|
||
import java.io.IOException;
|
||
import java.util.Arrays;
|
||
|
||
/**
|
||
* 文件上传控制器
|
||
*
|
||
* @author Fida Team
|
||
* @date 2026-02-03
|
||
*/
|
||
@Slf4j
|
||
@RestController
|
||
@RequestMapping("/file")
|
||
@Tag(name = "文件管理", description = "文件上传、下载等功能接口")
|
||
@RequiredArgsConstructor
|
||
public class FileUploadController {
|
||
|
||
private final MinioUtil minioUtil;
|
||
|
||
@Value("${multipart.max-file-size}")
|
||
private Long maxFileSize;
|
||
|
||
@PostMapping("/upload")
|
||
@Operation(summary = "文件上传", description = "上传文件到Minio服务器")
|
||
public Response<String> uploadFile(
|
||
@Parameter(description = "文件", required = true) @RequestParam("file") MultipartFile file,
|
||
@Parameter(description = "允许的文件类型") @RequestParam(value = "allowedTypes", required = false) String[] allowedTypes
|
||
) {
|
||
Long userId = UserContext.getUserId();
|
||
|
||
if (file.isEmpty()) {
|
||
throw new BusinessException("文件不能为空");
|
||
}
|
||
// 验证文件类型
|
||
String contentType = file.getContentType();
|
||
if (allowedTypes != null && allowedTypes.length > 0) {
|
||
boolean validType = false;
|
||
for (String allowedType : allowedTypes) {
|
||
if (contentType != null && contentType.startsWith(allowedType)) {
|
||
validType = true;
|
||
break;
|
||
}
|
||
}
|
||
if (!validType) {
|
||
throw new BusinessException("不支持的文件类型: " + contentType);
|
||
}
|
||
}
|
||
// 验证文件大小
|
||
if (file.getSize() > maxFileSize * 1024 * 1024) {
|
||
throw new BusinessException("文件大小超出限制: " + maxFileSize + " MB");
|
||
}
|
||
try {
|
||
// 计算文件MD5(可选,用于文件完整性校验)
|
||
String md5 = DigestUtil.md5Hex(file.getInputStream());
|
||
log.info("文件MD5: {}", md5);
|
||
|
||
// 调用MinioUtil上传文件(使用默认桶名,按userId划分文件夹)
|
||
String filePath = minioUtil.uploadImage(file, String.valueOf(userId));
|
||
|
||
log.info("文件上传成功: {}, 文件路径: {}", file.getOriginalFilename(), filePath);
|
||
|
||
return Response.success(minioUtil.processMinioResource(filePath, CommonConstants.MINIO_PATH_TIMEOUT));
|
||
} catch (IOException e) {
|
||
log.error("文件上传失败: {}", e.getMessage(), e);
|
||
throw new BusinessException("文件上传失败");
|
||
}
|
||
|
||
}
|
||
|
||
|
||
}
|