Springboot整合Minio,2024版教程

时间:2024-05-08 10:55:22
import io.minio.*; import io.minio.errors.*; import io.minio.http.Method; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.concurrent.TimeUnit; /** * @version 1.0.0 * @description minio启动时创建bucket * @date 2024/4/4 14:00 * @created by Guoshun */ @Slf4j @Component public class MinioService { @Resource private MinioClient minioClient; @Value("${minio.bucket}") private String bucketName; /** * 创建bucket * @return Boolean true成功 false 失败 */ @PostConstruct public Boolean createBucket(){ BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder() .bucket(bucketName).build(); try { boolean existsFlag = minioClient.bucketExists(bucketExistsArgs); if(!existsFlag){ MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build(); minioClient.makeBucket(makeBucketArgs); } }catch (Exception e){ e.printStackTrace(); log.error("Minio的bucket初始化失败{}", bucketName); return false; } return true; } /** * 文件上传 * @param inputStream * @param contentType * @param fileName * @return */ public Boolean put(InputStream inputStream, String contentType, String fileName) throws IOException { try { PutObjectArgs stream = PutObjectArgs.builder() .object(fileName) .bucket(bucketName) .contentType(contentType) .stream(inputStream, inputStream.available(), -1).build(); minioClient.putObject(stream); return true; }catch (Exception e){ log.error("文件上传失败,文件{}", fileName); throw new RuntimeException(e.getMessage()); }finally { if(inputStream != null){ inputStream.close(); } } } /** * 获取文件的url地址 * 支持版本管理后续增加 * * @param fileName */ public String getDownloadUrl(String fileName) { GetPresignedObjectUrlArgs presignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder() .bucket(bucketName).object(fileName).method(Method.GET).expiry(1, TimeUnit.HOURS).build(); try { String downloadUrl = minioClient.getPresignedObjectUrl(presignedObjectUrlArgs); return downloadUrl; } catch (ServerException | InsufficientDataException | ErrorResponseException | IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException | XmlParserException | InternalException e) { log.error("文件下载失败{}", fileName); throw new RuntimeException(e.getMessage()); } } /** * 获取文件流 * 后续支持写入抬头 * * @param fileName */ public ByteArrayOutputStream getDownloadFile(String fileName) throws IOException { GetObjectArgs getObjectArgs = GetObjectArgs.builder().object(fileName).bucket(bucketName).build(); byte[] buf = new byte[1024]; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024); try { GetObjectResponse downloadUrl = minioClient.getObject(getObjectArgs); int length = 0; while ((length = downloadUrl.read(buf)) > 0) { outputStream.write(buf, 0, length); } return outputStream; } catch (ServerException | InsufficientDataException | ErrorResponseException | IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException | XmlParserException | InternalException e) { log.error("文件下载失败{}", fileName); throw new RuntimeException(e.getMessage()); } finally { outputStream.close(); } } /** * 文件删除 * * @param key */ public boolean deleteFile(String key) { RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucketName).object(key).build(); try { minioClient.removeObject(removeObjectArgs); } catch (ServerException | InsufficientDataException | ErrorResponseException | IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException | XmlParserException | InternalException e){ log.error("文件删除失败{}", key); throw new RuntimeException(e.getMessage()); } return true; } }