暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot + MinIO 批量上传文件实战【踩坑记录】

源话编程 2024-07-11
1069

👋 热爱编程的小伙伴们,欢迎来到我的编程技术分享公众号!在这里,我会分享编程技巧、实战经验、技术干货,还有各种有趣的编程话题!

记录下使用 SpringBoot + MinIO 批量上传功能,今天没有过多的讲述,直接上代码了

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <scope>provided</scope>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
    </dependency>
</dependencies>

config

import io.minio.MinioClient;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinioConfiguration {

    @Resource
    private MinioProperties minioProperties;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(minioProperties.getEndpoint())
                .credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
                .build();
    }

    @Bean
    public String currentMinioBucketName() {
        return minioProperties.getBucketName();
    }

}

属性

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {

    private String endpoint;

    private String accessKey;

    private String secretKey;

    private String bucketName;

}

service(只包括上传方法)

import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Item;
import jakarta.annotation.Resource;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URI;

@Service
public class MinioService {

    @Resource
    private MinioClient minioClient;

    @Resource
    private String bucketName;

    /**
     * 使用MultipartFile进行文件上传
     *
     * @param file        文件名
     * @param objectName  对象名
     * @param contentType 类型
     * @return ObjectWriteResponse
     */

    @SneakyThrows
    public ObjectWriteResponse uploadFile(MultipartFile file, String objectName, String contentType) {
        InputStream inputStream = file.getInputStream();
        try {
            return minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName)
                            .object(objectName)
                            .contentType(contentType)
                            .stream(inputStream, inputStream.available(), -1)
                            .build());
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }
}    

controller调用

@Operation(summary = "批量上传文件")
@PostMapping("/batchUpload")
public ApiResult<List<String>> batchUpload(HttpServletRequest request, @RequestParam(value = "type") String type) {
    List<String> urlList = new ArrayList<>();
    try {
        // 从 request 中获取 MultipartFile 数组
        MultipartFile[] files = getMultipartFiles(request);
        for (MultipartFile file : files) {
            String url = sysFileService.uploadFile(file, type);
            urlList.add(url);
        }
    } catch (Exception e) {
        log.error("文件上传失败:", e);
    }
    return ApiResult.success(urlList);
}

/**
 * 从 HttpServletRequest 中获取 MultipartFile 数组
 */

private MultipartFile[] getMultipartFiles(HttpServletRequest request) {
    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
    List<MultipartFile> multipartFiles = new ArrayList<>();
    Iterator<String> fileNames = multipartRequest.getFileNames();
    while (fileNames.hasNext()) {
        String fileName = fileNames.next();
        multipartFiles.addAll(multipartRequest.getFiles(fileName));
    }
    return multipartFiles.toArray(new MultipartFile[0]);
}

踩坑记录

接收批量上传的文件使用HttpServletRequest request
,而不使用@RequestParam("files") MultipartFile[] files
或者 MultipartFile[] files
,会报错,意思说MultipartFile[] files
无法正确解析批量传递的文件参数。可能是我的配置问题,搜了搜问题,发现好多博客都是这么写,但是没有提及报错,后续再研究。


个人观点,仅供参考,希望这篇文章对你有所帮助!如有问题,欢迎留言讨论。


文章转载自源话编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论