👋 热爱编程的小伙伴们,欢迎来到我的编程技术分享公众号!在这里,我会分享编程技巧、实战经验、技术干货,还有各种有趣的编程话题!
记录下使用 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




