pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
application.yml
minio:
host: localhost:9000
url: ${minio.host}
access-key: IPt1g4wezvqXXzMEHVJs #在minio管理页面生成
secret-key: nbSRIZgIOPLDdgQWjA9qZ2pEvF6wkzOgdzYF
bucketName: public
配置类MinioConfig.class
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
/**
* 服务地址
*/
private String url;
/**
* 用户名
*/
private String accessKey;
/**
* 密码
*/
private String secretKey;
/**
* 存储桶名称
*/
private String bucketName;
@Bean
public MinioClient getMinioClient() {
return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
}
}
上传工具类
@Component
@AllArgsConstructor
public class FileUtil {
private final MinioConfig minioConfig;
private final MinioClient minioClient;
public String uploadFile(MultipartFile file) throws ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, InvalidExpiresRangeException {
PutObjectArgs objectArgs = PutObjectArgs.builder().object(file.getOriginalFilename())
.bucket(minioConfig.getBucketName()).stream(file.getInputStream(), file.getSize(), -1).build();
minioClient.putObject(objectArgs);
//上传后,获取文件URL
String presignedObjectUrl = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.bucket(minioConfig.getBucketName())
.object(file.getOriginalFilename())
.method(Method.GET) //默认就是GET
.expiry(60) //过期时间,默认是7天
.build()
);
System.out.println("getPresignedObjectUrl返回结果:" + presignedObjectUrl);
String objectUrl = minioClient.getObjectUrl("public", file.getOriginalFilename());
System.out.println("getObjectUrl返回结果:" + objectUrl);
return objectUrl;
}
}
关于获取返回文件地址的url,可以通过getObjectUrl和getPresignedObjectUrl方法去获取,但是getObjectUrl从minio的8.0的某个版本已被删除,只保留了getPresignedObjectUrl,而这里用的7的版本,两个方法都还有。
这两个方法区别在于,getObjectUrl直接返回文件地址,而getPresignedObjectUrl会返回X-Amz开头的加密、签名、过期时间等信息作为url参数。
getPresignedObjectUrl返回结果:http://127.0.0.1:9000/public/data-1724867149483.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=IPt1g4wezvqXXzMEHVJs%2F20240911%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240911T084648Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host&X-Amz-Signature=b4af8730d9b7778ab584c2405dd2a390ca02af694f167f0f3caa67266a9b6c38
getObjectUrl返回结果:http://127.0.0.1:9000/public/data-1724867149483.csv
也就是说getPresignedObjectUrl生成url过期后会失效。但是,把这个url后面的参数去掉,就是与getObjectUrl返回的结果一样的,而且这个url仍然能使用
public static void main(String[] args) {
String url = "http://127.0.0.1:9000/public/SteamSetup.exe?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=IPt1g4wezvqXXzMEHVJs%2F20240911%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240911T074557Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=7d409cdab249f6e8597ccdfb8765e355a3dc96a32c0c351dde70c75e34d3655e";
//把上面的url后面的参数去掉
String[] split = url.split("\\?");
System.out.println(split[0]);
}