阿里云oss (批量)文件上传 Java SpringBoot

阿里云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字段就行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值