SpringBoot整合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{privateString ENDPOINT;privateString ACCESS_KEY;privateString SECRET_KEY;privatestaticfinalString BUCKET_PARAM="${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+"/*\"]}]}";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+"/*\"]}]}";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+"/*\"]}]}";publicStringgetObjectPrefixUrl(String bucket){returnString.format("%s/%s/", ENDPOINT, 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());}}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;}}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;}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;}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());}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;}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());}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:10004ACCESS_KEY: minioSECRET_KEY: dyminio123
3、MinioConstants.java
publicclassMinioConstants{publicstaticfinalString IMAGE_JPG="image/jpeg";publicstaticfinalString IMAGE_PNG="image/png";publicstaticfinalString IMAGE_GIF="image/gif";publicstaticfinalString APPLICATION_PDF="application/pdf";publicstaticfinalString APPLICATION_MP4="video/mp4";publicstaticfinalString APPLICATION_WORD="application/msword";publicstaticfinalString APPLICATION_STREAM="application/octet-stream";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("-"