通用文件上传接口

本文来记录一个通用的文件上传接口

文章目录


测试程序

测试程序

  /**
   * 通用上传请求
   */
  @PostMapping("/upload/file")
  @ResponseBody
  @ApiOperation(value = "上传文件")
  public ResponseBean<?> uploadFile(MultipartFile[] files) {
  
        //无文件返回错误
        if (files == null || files.length == 0) {
            return new ResponseBean<>(400, "无文件", -1);
        }
        //新文件名
        StringBuilder newFileName;
        //全部文件名,若多个,则逗号分隔
        StringBuilder allFileNames = new StringBuilder();
        //上传路径
        String fileSavePath = RuoYiConfig.getUploadPath();
        //若文件夹不存在,则创建文件夹
        //test.txt不会创建,故给任意值占位即可
        File parentFile = new File(fileSavePath + "test.txt").getParentFile();
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }
        //遍历所有文件
        for (MultipartFile file : files) {
            //得到原始文件名
            newFileName = new StringBuilder(file.getOriginalFilename());
            //查询文件名中点号所处位置
            int i = newFileName.lastIndexOf(".");
            //若点号位置大于0,则文件名正常
            if (i > 0) {
                //在点号前拼接UUID防止文件重名
                newFileName.insert(i, "_" + UUID.randomUUID().toString().substring(0, 5));
            } else {
                //若点号位置小于等于0,则文件名不规范
                return new ResponseBean<>(400, "文件'" + newFileName + "'名称不规范", -1);
            }
            try {
                // 保存文件
                file.transferTo(new File(fileSavePath + newFileName));
                //若全部文件名为空,则此为第一个文件,直接追加此文件名
                if (StringUtils.isBlank(allFileNames.toString())) {
                    allFileNames.append(newFileName);
                } else {
                    //若全部文件名不为空,则追加逗号和文件名
                    allFileNames
                            .append(",")
                            .append(newFileName)
                            .toString();
                }
            } catch (IOException e) {
                log.error("文件上传异常:\n" + e.getMessage());
                return new ResponseBean<>(500, "上传失败", -1);
            }
        }
        //返回全部文件名和文件路径
        HashMap<String, String> fileInfo = new HashMap<String, String>(2) {{
            put("fileNames", allFileNames.toString());
            put("filePath", fileSavePath);
        }};
        //返回信息
        return new ResponseBean<>(200, "上传成功", fileInfo);
    }

ResponseBean<?>

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseBean<T> {

    private Integer code;

    private String msg;

    private T data;

}

测试结果

在这里插入图片描述
在这里插入图片描述

### 使用 MinIO 实现通用文件上传接口 #### 设计思路 为了创建一个通用文件上传接口,可以基于 Spring Boot 和 MinIO 客户端库。该接口应支持多种类型的文件上传操作,并能够处理不同场景下的需求。 #### 准备工作 首先,在项目中引入必要的依赖项。除了Spring Boot的基础组件外,还需要加入MinIO客户端以及用于检测文件类型的`simplemagic`工具包[^2]: ```xml <dependencies> <!-- MinIO Client --> <dependency> <groupId>io.minio</groupId> <artifactId|minio|</artifactId> <version>8.5.7</version> </dependency> <!-- 文件类型识别 --> <dependency> <groupId>com.j256.simplemagic</groupId> <artifactId>simplemagic</artifactId> <version>1.16</version> </dependency> ... </dependencies> ``` #### 创建控制器类 定义一个名为 `FileController` 的 RESTful API 控制器来接收来自前端或其他服务发送过来的数据流并将其保存到MinIO服务器上: ```java @RestController @RequestMapping("/api/files") public class FileController { private final MinioClient minioClient; private static final String BUCKET_NAME = "my-bucket"; @Autowired public FileController(MinioClient minioClient){ this.minioClient = minioClient; try { if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(BUCKET_NAME).build())) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(BUCKET_NAME).build()); } } catch (Exception e) { throw new RuntimeException(e); } } /** * 处理单个文件上传请求. */ @PostMapping(value="/upload", consumes="multipart/form-data") public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) throws Exception{ // 获取文件元数据 String fileName = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); // 设置对象名称为原始文件名 PutObjectArgs objectArgs = PutObjectArgs.builder() .bucket(BUCKET_NAME) .object(fileName) .stream(inputStream, file.getSize(), -1) .contentType(file.getContentType()) .build(); // 将文件入指定桶内 minioClient.putObject(objectArgs); return ResponseEntity.ok("Upload successful"); } } ``` 此段代码实现了基本的功能——接受一个多部分表单格式(`multipart/form-data`)的POST请求并将接收到的内容作为二进制流传送给MinIO存储系统[^1]。 对于更复杂的应用场景比如分片上传或断点续传,则可以根据实际情况调整上述方法中的逻辑结构以适应特定的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值