阿里云oss (批量)文件上传 Java SpringBoot
本文以Java单个上传文件或者批量上传文件为例,支持各种格式的文件上传,返回结果封装vo 类
1、控制层controller
@PostMapping("/upload")
public BaseResponse<FileUploadResultVo> uploadMultipleFiles(@RequestParam("file") MultipartFile[] files) {
// 检查是否有文件上传,如果没有则抛出业务异常
if (files.length == 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请至少上传一个文件");
}
// 调用服务层方法处理文件上传,并获取上传结果
FileUploadResultVo fileUploadResultVo = userBackendService.uploadFile(files);
// 返回包含上传结果的响应对象
return ResultUtils.success(fileUploadResultVo);
}
2、业务层Service
FileUploadResultVo uploadFile(MultipartFile[] file);
@Override
public FileUploadResultVo uploadFile(MultipartFile[] files) {
if (files.length == 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请至少上传一个文件");
}
// 初始化返回结果对象
FileUploadResultVo resultVO = new FileUploadResultVo();
// 成功上传的文件URL列表
List<String> successUrls = new ArrayList<>();
// 未成功上传的文件原名列表
List<String> failedFiles = new ArrayList<>();
// 总文件数量
int totalFiles = files.length;
// 成功上传的文件计数
int successCount = 0;
// 上传失败的文件计数
int failedCount = 0;
// 遍历文件数组进行上传操作
for (MultipartFile file : files) {
// 获取文件原始名称
String originalFilename = file.getOriginalFilename();
log.info("记录一下文件名字:" + originalFilename);
// 检查文件是否为空
if (file.isEmpty()) {
// 添加到失败列表
failedFiles.add(originalFilename);
// 失败计数增加
failedCount++;
continue;
}
// 上传文件,返回上传后的URL
String uploadUrl = aliYunOssUtils.fileUpload(file);
if (uploadUrl != null) {
// 添加到成功URL列表
successUrls.add(uploadUrl);
// 成功计数增加
successCount++;
} else {
// 添加到失败列表
failedFiles.add(originalFilename);
// 失败计数增加
failedCount++;
}
}
// 设置结果对象的属性
resultVO.setSuccessUrl(successUrls);
resultVO.setFailedFiles(failedFiles);
resultVO.setTotalFiles(totalFiles);
resultVO.setSuccessfulCount(successCount);
resultVO.setFailedCount(failedCount);
// 返回包含所有上传结果信息的对象
return resultVO;
}
3、阿里云工具类
/**
* @param file 需要上传的文件
* @return
* @description: 阿里云简单上传文件
* @author: lizhiwei
* @date: 2024/1/9 13:42
**/
public String fileUpload(MultipartFile file) {
// 阿里云OSS配置信息
String accessKeyId = aliyunOssConfig.getAccessKeyId();
String accessKeySecret = aliyunOssConfig.getAccessKeySecret();
String endPoint = aliyunOssConfig.getEndPoint();
String bucketName = aliyunOssConfig.getBucketName();
// 获取原始文件名
String originalFilename = file.getOriginalFilename();
// 获取文件扩展名
int dotIndex = originalFilename.lastIndexOf('.');
String extension = (dotIndex == -1) ? "" : originalFilename.substring(dotIndex + 1);
// 生成文件存储的目标路径
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
String folderName = sdf.format(new Date());
String objectName = folderName + "/" + System.currentTimeMillis();
// 如果文件没有扩展名,则返回null
if (extension.isEmpty()) {
return null;
}
objectName += "." + extension;
// 创建OSSClient实例
OSS ossClient;
try {
ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
} catch (Exception e) {
log.error("记录日志:创建ossClient实例失败,原因是:{}", e.getMessage());
throw new BusinessException(ErrorCode.SYSTEM_ERROR, "创建ossClient实例失败");
}
// 上传文件到OSS
try {
// 获取文件输入流
try (InputStream fileInputStream = file.getInputStream()) {
PutObjectResult result = ossClient.putObject(bucketName, objectName, fileInputStream);
// 检查是否上传失败
if (result.getResponse() != null) {
log.error("记录日志:上传失败:{}", result.getResponse().getErrorResponseAsString());
return null;
}
// 返回成功上传的文件URL
return "https://" + bucketName + "." + URI.create(endPoint).getHost() + "/" + objectName;
}
} catch (IOException e) {
log.error("记录日志:文件处理异常:{}", e.getMessage());
throw new BusinessException(ErrorCode.SYSTEM_ERROR, "文件处理异常");
} finally {
// 关闭OSSClient
if (ossClient != null) {
ossClient.shutdown();
}
}
}
4、Vo类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FileUploadResultVo {
private List<String> successUrl;
private List<String> failedFiles;
private int totalFiles;
private int successfulCount;
private int failedCount;
}
我封装了返回的Vo类,用于批量上传的时候显示哪些文件上传成功,哪些文件上传失败,如果上传失败返回该文件名称提示用户或管理员
返回的结果如下:
{
"code": 0,
"data": {
"successUrl": [
"https://xxx.oss-cn-beijing.aliyuncs.com/202401/177447.txt",
"https://xxx.oss-cn-beijing.aliyuncs.com/202401/1704787757519.pdf"
],
"failedFiles": [
"xxxxxxx_失败文件名称"
],
"totalFiles": 3,
"successfulCount": 2,
"failedCount": 1
},
"message": "ok"
}
5、总结
本文完成了阿里云文件上传和批量文件上传,使用apifox可以使用body里面的form-data完成上传,注意批量上传的时候是使用一个file字段就行。