farm模块-批量上传
This commit is contained in:
@@ -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({
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成文件预签名地址信息
|
* 生成文件预签名地址信息
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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. 生成前缀、后缀
|
||||||
|
|||||||
Reference in New Issue
Block a user