farm模块-批量上传

This commit is contained in:
顾君禹
2025-08-16 16:39:21 +08:00
parent cbf3703c47
commit 34c73d2e26
3 changed files with 62 additions and 0 deletions

View File

@@ -50,6 +50,12 @@ public class FileController {
uploadReqVO.getDirectory(), file.getContentType())); uploadReqVO.getDirectory(), file.getContentType()));
} }
@PostMapping("/upload-multi")
@Operation(summary = "多文件上传", description = "批量上传多个文件")
public CommonResult<FileMultiUploadRespVO> uploadMultiFiles(@Valid FileMultiUploadReqVO uploadReqVO) throws Exception {
return success(fileService.createFiles(uploadReqVO.getFiles(), uploadReqVO.getDirectory()));
}
@GetMapping("/presigned-url") @GetMapping("/presigned-url")
@Operation(summary = "获取文件预签名地址", description = "模式二:前端上传文件:用于前端直接上传七牛、阿里云 OSS 等文件存储器") @Operation(summary = "获取文件预签名地址", description = "模式二:前端上传文件:用于前端直接上传七牛、阿里云 OSS 等文件存储器")
@Parameters({ @Parameters({

View File

@@ -4,8 +4,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FileCreateReqVO; import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FileCreateReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO; import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO; import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FileMultiUploadRespVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import org.springframework.web.multipart.MultipartFile;
import java.util.List; import java.util.List;
@@ -36,6 +38,15 @@ public interface FileService {
String createFile(@NotEmpty(message = "文件内容不能为空") byte[] content, String createFile(@NotEmpty(message = "文件内容不能为空") byte[] content,
String name, String directory, String type); String name, String directory, String type);
/**
* 批量上传文件
*
* @param files 文件列表
* @param directory 目录,允许空
* @return 多文件上传结果
*/
FileMultiUploadRespVO createFiles(List<MultipartFile> files, String directory);
/** /**
* 生成文件预签名地址信息 * 生成文件预签名地址信息
* *

View File

@@ -2,14 +2,19 @@ package cn.iocoder.yudao.module.infra.service.file;
import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil; import cn.hutool.crypto.digest.DigestUtil;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FileCreateReqVO; import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FileCreateReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO; import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO; import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FileMultiUploadRespVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import cn.iocoder.yudao.module.infra.dal.mysql.file.FileMapper; import cn.iocoder.yudao.module.infra.dal.mysql.file.FileMapper;
import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient; import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient;
@@ -92,6 +97,46 @@ public class FileServiceImpl implements FileService {
return url; return url;
} }
@Override
@SneakyThrows
public FileMultiUploadRespVO createFiles(List<MultipartFile> files, String directory) {
FileMultiUploadRespVO result = new FileMultiUploadRespVO();
List<FileMultiUploadRespVO.FileUploadResult> successFiles = new ArrayList<>();
List<FileMultiUploadRespVO.FileUploadResult> failedFiles = new ArrayList<>();
for (MultipartFile file : files) {
FileMultiUploadRespVO.FileUploadResult fileResult = new FileMultiUploadRespVO.FileUploadResult();
fileResult.setOriginalName(file.getOriginalFilename());
fileResult.setSize(file.getSize());
fileResult.setType(file.getContentType());
try {
// 上传文件
byte[] content = IoUtil.readBytes(file.getInputStream());
String url = createFile(content, file.getOriginalFilename(), directory, file.getContentType());
// 设置成功结果
fileResult.setUrl(url);
fileResult.setSuccess(true);
successFiles.add(fileResult);
} catch (Exception e) {
// 设置失败结果
fileResult.setSuccess(false);
fileResult.setErrorMessage(e.getMessage());
failedFiles.add(fileResult);
}
}
// 设置统计信息
result.setSuccessFiles(successFiles);
result.setFailedFiles(failedFiles);
result.setTotalCount(files.size());
result.setSuccessCount(successFiles.size());
result.setFailedCount(failedFiles.size());
return result;
}
@VisibleForTesting @VisibleForTesting
String generateUploadPath(String name, String directory) { String generateUploadPath(String name, String directory) {
// 1. 生成前缀、后缀 // 1. 生成前缀、后缀