SpringBoot整合minio对象存储

2022-04-15 19:12:02

SpringBoot整合minio对象存储

一、导入依赖

<!--minio的依赖配置--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.1</version></dependency>

二、编写配置类

1、MinioAPI.java

importio.minio.*;importio.minio.http.Method;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;importjava.io.InputStream;@Data@Component@ConfigurationProperties(prefix="minio")publicclassMinioAPI{/**
	 * minio参数
	 */privateString ENDPOINT;privateString ACCESS_KEY;privateString SECRET_KEY;/* private static final String ENDPOINT = "http://192.168.92.133:9000";
    private static final String ACCESS_KEY = "minioadmin";
    private static final String SECRET_KEY = "minioadmin";*//**
	 * 桶占位符
	 */privatestaticfinalString BUCKET_PARAM="${bucket}";/**
	 * bucket权限-只读
	 */privatestaticfinalString READ_ONLY="{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\"],\"Resource\":[\"arn:aws:s3:::"+ BUCKET_PARAM+"\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::"+ BUCKET_PARAM+"/*\"]}]}";/**
	 * bucket权限-只读
	 */privatestaticfinalString WRITE_ONLY="{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::"+ BUCKET_PARAM+"\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::"+ BUCKET_PARAM+"/*\"]}]}";/**
	 * bucket权限-读写
	 */privatestaticfinalString READ_WRITE="{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::"+ BUCKET_PARAM+"\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\"Resource\":[\"arn:aws:s3:::"+ BUCKET_PARAM+"/*\"]}]}";/**
	 * 文件url前半段
	 *
	 * @param bucket 桶
	 * @return 前半段
	 */publicStringgetObjectPrefixUrl(String bucket){returnString.format("%s/%s/", ENDPOINT, bucket);}/**
	 * 创建桶
	 *
	 * @param bucket 桶
	 */publicvoidmakeBucket(String bucket)throwsException{MinioClient client=MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build();// 判断桶是否存在boolean isExist= client.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());if(!isExist){// 新建桶
			client.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());}}/**
	 * 更新桶权限策略
	 *
	 * @param bucket 桶
	 * @param policy 权限
	 */publicvoidsetBucketPolicy(String bucket,String policy)throwsException{MinioClient client=MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build();switch(policy){case"read-only":
				client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).config(READ_ONLY.replace(BUCKET_PARAM, bucket)).build());break;case"write-only":
				client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).config(WRITE_ONLY.replace(BUCKET_PARAM, bucket)).build());break;case"read-write":
				client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).config(READ_WRITE.replace(BUCKET_PARAM, bucket)).build());break;case"none":default:break;}}/**
	 * 上传本地文件
	 *
	 * @param bucket    桶
	 * @param objectKey 文件key
	 * @param filePath  文件路径
	 * @return 文件url
	 */publicStringuploadFile(String bucket,String objectKey,String filePath)throwsException{MinioClient client=MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build();
		client.uploadObject(UploadObjectArgs.builder().bucket(bucket).object(objectKey).filename(filePath).contentType("image/png").build());returngetObjectPrefixUrl(bucket)+ objectKey;}/**
	 * 流式上传文件
	 *
	 * @param bucket      桶
	 * @param objectKey   文件key
	 * @param inputStream 文件输入流
	 * @param contentType 文件输入流类型   
	 * @return 文件url
	 */publicStringuploadInputStream(String bucket,String objectKey,InputStream inputStream,String contentType)throwsException{MinioClient client=MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build();
		client.putObject(PutObjectArgs.builder().bucket(bucket).object(objectKey).stream(inputStream, inputStream.available(),-1).contentType(contentType).build());returngetObjectPrefixUrl(bucket)+ objectKey;}/**
	 * 下载文件
	 *
	 * @param bucket    桶
	 * @param objectKey 文件key
	 * @return 文件流
	 */publicInputStreamdownload(String bucket,String objectKey)throwsException{MinioClient client=MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build();return client.getObject(GetObjectArgs.builder().bucket(bucket).object(objectKey).build());}/**
	 * 文件复制
	 *
	 * @param sourceBucket    源桶
	 * @param sourceObjectKey 源文件key
	 * @param bucket          桶
	 * @param objectKey       文件key
	 * @return 新文件url
	 */publicStringcopyFile(String sourceBucket,String sourceObjectKey,String bucket,String objectKey)throwsException{MinioClient client=MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build();CopySource source=CopySource.builder().bucket(sourceBucket).object(sourceObjectKey).build();
		client.copyObject(CopyObjectArgs.builder().bucket(bucket).object(objectKey).source(source).build());returngetObjectPrefixUrl(bucket)+ objectKey;}/**
	 * 删除文件
	 *
	 * @param bucket    桶
	 * @param objectKey 文件key
	 */publicvoiddeleteFile(String bucket,String objectKey)throwsException{MinioClient client=MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build();
		client.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectKey).build());}/**
	 * 获取文件签名url
	 *
	 * @param bucket    桶
	 * @param objectKey 文件key
	 * @param expires   签名有效时间  单位秒
	 * @return 文件签名地址
	 */publicStringgetSignedUrl(String bucket,String objectKey,int expires)throwsException{MinioClient client=MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build();return client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucket).object(objectKey).expiry(expires).build());}}

2、application.yml

minio:ENDPOINT: http://192.168.0.198:10004#Minio服务所在地址ACCESS_KEY: minio#访问的keySECRET_KEY: dyminio123#访问的秘钥

3、MinioConstants.java

publicclassMinioConstants{//图片,浏览器能预览publicstaticfinalString IMAGE_JPG="image/jpeg";publicstaticfinalString IMAGE_PNG="image/png";publicstaticfinalString IMAGE_GIF="image/gif";// pdf文档,浏览器能预览 application/pdfpublicstaticfinalString APPLICATION_PDF="application/pdf";// 视频,浏览器能预览 video/mp4publicstaticfinalString APPLICATION_MP4="video/mp4";// Wworld类型publicstaticfinalString APPLICATION_WORD="application/msword";// 二进制流,不知道下载文件类型 application/octet-streampublicstaticfinalString APPLICATION_STREAM="application/octet-stream";/**
	 * 设置获取文件和图片的过期时间,expires签名有效时间  单位秒
	 */publicstaticfinalInteger EXPIRES=604800;/**
	 * 图片 桶
	 */publicstaticfinalString BUCKET_IMG="img";/**
	 * 文件 桶
	 */publicstaticfinalString BUCKET_FILE="file";/**
	 * 视频 桶
	 */publicstaticfinalString BUCKET_VIDEO="video";}

三、代码示例(多文件)

1、上传文件

//设置多个文件if(!ObjectUtils.isEmpty(knFiles)&& knFiles!=null&& knFiles.length>0&& knFiles[0].getSize()>0L){//日期格式化Date d=newDate();SimpleDateFormat sdf=newSimpleDateFormat("yyyy-MM-dd");String dateNowStr= sdf.format(d);//给文件和图片重新命名String datestr= dateNowStr+"/"+ knowledgeId+"/"+ dateNowStr+"-";StringBuilder sb=newStringBuilder();for(int i=0; i< knFiles.length;++i){String img= datestr+ knFiles[i].getOriginalFilename();try{InputStream is= knFiles[i].getInputStream();this.minioAPI.uploadInputStream(MinioConstants.BUCKET_KNOWLEDGE_FILE, img, is,MinioConstants.APPLICATION_WORD);}catch(Exception e){System.out.println("============上传文件失败=========");
					e.printStackTrace();}//把图片用逗号隔开if(sb.length()>0){
					sb.append(",");}
				sb.append(img);}String s= sb.toString();if(!StringUtils.isEmpty(knId)&& knId!=" "&&!knId.equals("null")){//编辑/修改时保存之前的文件或者图片KnowledgeData byId= knowledgeDataService.getById(knId);if(byId!=null&&!StringUtils.isEmpty(byId.getKnFile())){String knFiless= byId.getKnFile()+","+ s;
					knowledgeData.setKnFile(knFiless);}else{
					knowledgeData.setKnFile(s);}}else{
				knowledgeData.setKnFile(s);}}

2、查看文件

//获取文件String imgName= knowledgeData.getKnFile();if(imgName!=null){String[] imgs= imgName.split(",");Map<String,String> map=newHashMap<>();for(int i=0; i< imgs.length;++i){try{String signedFileUrl=this.minioAPI.getSignedUrl(MinioConstants.BUCKET_KNOWLEDGE_FILE, imgs[i],MinioConstants.EXPIRES);String fileName= imgs[i].substring(imgs[i].lastIndexOf("-")+1);
						map.put(fileName,signedFileUrl);}catch(Exception e){
						e.printStackTrace();}}
				backListVO.setKnFiles(map);}

3、删除文件

/**
	 * 文件删除接口
	 */@PostMapping("/file/delete")@ApiOperation(value="文件删除接口")@TransactionalpublicRupload(@ApiParam(value="文件名称")@RequestParamString fileName,@ApiParam(value="主键knId")@RequestParamString knId){KnowledgeData knowledgeData=newKnowledgeData();
		knowledgeData.setKnId(Integer.valueOf(knId));KnowledgeData byId= knowledgeDataService.getById(knId);if(byId!=null&&!StringUtils.isEmpty(byId.getKnFile())){//获取文件String imgName= byId.getKnFile();if(imgName!=null){String[] imgs= imgName.split(",");StringBuilder sb=newStringBuilder();for(int i=0; i< imgs.length;++i){String fileName1= imgs[i].substring(imgs[i].lastIndexOf("-"
  • 作者:李潘杜若
  • 原文链接:https://blog.csdn.net/weixin_49385823/article/details/123922409
    更新时间:2022-04-15 19:12:02