spring boot minio,

  spring boot minio,

  首先砰的一声文件引入相关依赖

  !-minio-dependency groupIdio.minio/groupId artifact id minio/artifact id版本3 .0 .10/版本/依赖性弹簧引导配置文件应用程序.阳明海运股份有限公司里配置迷妮欧信息

  #迷你欧配置迷你:端点: http://$ { minio _ host :172。16 .10 .21 } :9000/访问密钥: $ { minio _ user : minioadmin }密钥: $ { minio _ pwd : minioadmin }存储桶3360 $ { minio _ space 3360 space data } http-URL 3360创建迷你项目字段项目类

  导入io。米尼奥。消息。项;导入io。米尼奥。消息。业主;导入io。昂首阔步。注释。API模型属性;进口龙目岛。数据;导入Java。util。日期;@Datapublic类MinioItem { /**对象名称**/@ApiModelProperty(对象名称)私有字符串objectName/**最后操作时间**/@ApiModelProperty(最后操作时间)私人日期上次修改时间私有字符串etag/**对象大小**/@ApiModelProperty(对象大小)私有字符串大小;私有字符串存储类;私人所有者所有者;/**对象类型:目录(目录)或文件(文件)**/@ApiModelProperty(对象类型:目录(目录)或文件(文件))私有字符串类型;public minio item(字符串对象名,最后修改日期,字符串etag,字符串大小,字符串存储类,所有者所有者,字符串类型){ this。对象名=对象名;这个。上次修改=上次修改;this . etag=etag this . size=size this。存储类=存储类;this.owner=所有者;this.type=type}公共minio Item(Item Item){ this。对象名称=项目。对象名();this.type=item.isDir()?目录":"文件;这个。etag=项目。etag();长尺寸num=item。对象大小();this.size=sizeNum 0?转换文件大小(大小编号):“0”;这个。存储类别=项目。存储类();这个。所有者=项目。owner();请尝试{这个。上次修改时间=项目。上次修改时间();} catch(NullPointerException e){ } }公共字符串转换filesize(long size){ long kb=1024;长mb=kb * 1024长GB=MB * 1024 if(size=GB){ return Strin

  g.format("%.1f GB", (float) size / gb); } else if (size >= mb) { float f = (float) size / mb; return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); } else if (size >= kb) { float f = (float) size / kb; return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); } else{ return String.format("%d B", size); } }}创建MinioTemplate模板类

  

import com.gis.spacedata.domain.dto.minio.MinioItem;import com.google.common.collect.Lists;import io.minio.MinioClient;import io.minio.ObjectStat;import io.minio.Result;import io.minio.errors.*;import io.minio.messages.Bucket;import io.minio.messages.Item;import lombok.RequiredArgsConstructor;import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Value;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Component;import org.springframework.util.FileCopyUtils;import org.xmlpull.v1.XmlPullParserException; import javax.servlet.http.HttpServletRequest;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.net.URL;import java.net.URLEncoder;import java.nio.charset.StandardCharsets;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.util.ArrayList;import java.util.List;import java.util.Optional; @Slf4j@Component@RequiredArgsConstructorpublic class MinioTemplate implements InitializingBean { /** * minio的路径 **/ @Value("${minio.endpoint}") private String endpoint; /** * minio的accessKey **/ @Value("${minio.accessKey}") private String accessKey; /** * minio的secretKey **/ @Value("${minio.secretKey}") private String secretKey; /** * 下载地址 **/ @Value("${minio.http-url}") private String httpUrl; @Value("${minio.bucket}") private String bucket; private static MinioClient minioClient; @Override public void afterPropertiesSet() throws Exception { minioClient = new MinioClient(endpoint, accessKey, secretKey); } @SneakyThrows public boolean bucketExists(String bucketName) { return minioClient.bucketExists(bucketName); } /** * 创建bucket * * @param bucketName bucket名称 */ @SneakyThrows public void createBucket(String bucketName) { if (!bucketExists(bucketName)) { minioClient.makeBucket(bucketName); } } /** * 获取全部bucket * <p> * https://docs.minio.io/cn/java-client-api-reference.html#listBuckets */ @SneakyThrows public List<Bucket> getAllBuckets() { return minioClient.listBuckets(); } /** * 根据bucketName获取信息 * * @param bucketName bucket名称 */ @SneakyThrows public Optional<Bucket> getBucket(String bucketName) { return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst(); } /** * 根据bucketName删除信息 * * @param bucketName bucket名称 */ @SneakyThrows public void removeBucket(String bucketName) { minioClient.removeBucket(bucketName); } /** * 根据文件前缀查询文件 * * @param bucketName bucket名称 * @param prefix 前缀 * @param recursive 是否递归查询 * @return MinioItem 列表 */ @SneakyThrows public List<MinioItem> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) { List<MinioItem> objectList = new ArrayList<>(); Iterable<Result<Item>> objectsIterator = minioClient.listObjects(bucketName, prefix, recursive); for (Result<Item> result : objectsIterator) { objectList.add(new MinioItem(result.get())); } return objectList; } /** * 获取文件外链 * * @param bucketName bucket名称 * @param objectName 文件名称 * @param expires 过期时间 <=7 * @return url */ @SneakyThrows public String getObjectURL(String bucketName, String objectName, Integer expires) { return minioClient.presignedGetObject(bucketName, objectName, expires); } /** * 获取文件外链 * * @param bucketName bucket名称 * @param objectName 文件名称 * @return url */ @SneakyThrows public String getObjectURL(String bucketName, String objectName) { return minioClient.presignedGetObject(bucketName, objectName); } /** * 获取文件url地址 * * @param bucketName bucket名称 * @param objectName 文件名称 * @return url */ @SneakyThrows public String getObjectUrl(String bucketName, String objectName) { return minioClient.getObjectUrl(bucketName, objectName); } /** * 获取文件 * * @param bucketName bucket名称 * @param objectName 文件名称 * @return 二进制流 */ @SneakyThrows public InputStream getObject(String bucketName, String objectName) { return minioClient.getObject(bucketName, objectName); } /** * 上传文件(流下载) * * @param bucketName bucket名称 * @param objectName 文件名称 * @param stream 文件流 * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject */ public void putObject(String bucketName, String objectName, InputStream stream) throws Exception { String contentType = "application/octet-stream"; if ("json".equals(objectName.split("\.")[1])) { //json格式,C++编译生成文件,需要直接读取 contentType = "application/json"; } minioClient.putObject(bucketName, objectName, stream, stream.available(), contentType); } /** * 上传文件 * * @param bucketName bucket名称 * @param objectName 文件名称 * @param stream 文件流 * @param size 大小 * @param contextType 类型 * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject */ public void putObject(String bucketName, String objectName, InputStream stream, long size, String contextType) throws Exception { minioClient.putObject(bucketName, objectName, stream, size, contextType); } /** * 获取文件信息 * * @param bucketName bucket名称 * @param objectName 文件名称 * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#statObject */ public ObjectStat getObjectInfo(String bucketName, String objectName) throws Exception { return minioClient.statObject(bucketName, objectName); } /** * 删除文件夹及文件 * * @param bucketName bucket名称 * @param objectName 文件或文件夹名称 * @since tarzan LIU */ public void removeObject(String bucketName, String objectName) { try { if (StringUtils.isNotBlank(objectName)) { if (objectName.endsWith(".") objectName.endsWith("/")) { Iterable<Result<Item>> list = minioClient.listObjects(bucketName, objectName); list.forEach(e -> { try { minioClient.removeObject(bucketName, e.get().objectName()); } catch (InvalidBucketNameException invalidBucketNameException) { invalidBucketNameException.printStackTrace(); } catch (NoSuchAlgorithmException noSuchAlgorithmException) { noSuchAlgorithmException.printStackTrace(); } catch (InsufficientDataException insufficientDataException) { insufficientDataException.printStackTrace(); } catch (IOException ioException) { ioException.printStackTrace(); } catch (InvalidKeyException invalidKeyException) { invalidKeyException.printStackTrace(); } catch (NoResponseException noResponseException) { noResponseException.printStackTrace(); } catch (XmlPullParserException xmlPullParserException) { xmlPullParserException.printStackTrace(); } catch (ErrorResponseException errorResponseException) { errorResponseException.printStackTrace(); } catch (InternalException internalException) { internalException.printStackTrace(); } }); } } } catch (XmlPullParserException e) { e.printStackTrace(); } } /** * 下载文件夹内容到指定目录 * * @param bucketName bucket名称 * @param objectName 文件或文件夹名称 * @param dirPath 指定文件夹路径 * @since tarzan LIU */ public void downloadTargetDir(String bucketName, String objectName, String dirPath) { try { if (StringUtils.isNotBlank(objectName)) { if (objectName.endsWith(".") objectName.endsWith("/")) { Iterable<Result<Item>> list = minioClient.listObjects(bucketName, objectName); list.forEach(e -> { try { String url = minioClient.getObjectUrl(bucketName, e.get().objectName()); getFile(url, dirPath); } catch (InvalidBucketNameException invalidBucketNameException) { invalidBucketNameException.printStackTrace(); } catch (NoSuchAlgorithmException noSuchAlgorithmException) { noSuchAlgorithmException.printStackTrace(); } catch (InsufficientDataException insufficientDataException) { insufficientDataException.printStackTrace(); } catch (IOException ioException) { ioException.printStackTrace(); } catch (InvalidKeyException invalidKeyException) { invalidKeyException.printStackTrace(); } catch (NoResponseException noResponseException) { noResponseException.printStackTrace(); } catch (XmlPullParserException xmlPullParserException) { xmlPullParserException.printStackTrace(); } catch (ErrorResponseException errorResponseException) { errorResponseException.printStackTrace(); } catch (InternalException internalException) { internalException.printStackTrace(); } }); } } } catch (XmlPullParserException e) { e.printStackTrace(); } } public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException { try { // 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象 MinioClient minioClient = new MinioClient("http://172.16.10.201:9000/", "minioadmin", "minioadmin"); // 检查存储桶是否已经存在 boolean isExist = minioClient.bucketExists("spacedata"); if (isExist) { System.out.println("Bucket already exists."); } else { // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。 minioClient.makeBucket("spacedata"); } // 使用putObject上传一个文件到存储桶中。 // minioClient.putObject("spacedata", "测试.jpg", "C:\Users\sundasheng44\Desktop\1.png"); // minioClient.removeObject("spacedata", "20200916/8ca27855ba884d7da1496fb96907a759.dwg"); Iterable<Result<Item>> list = minioClient.listObjects("spacedata", "CompileResult/"); List<String> list1 = Lists.newArrayList(); list.forEach(e -> { try { list1.add("1"); String url = minioClient.getObjectUrl("spacedata", e.get().objectName()); System.out.println(url); //getFile(url, "C:\Users\liuya\Desktop\" + e.get().objectName()); System.out.println(e.get().objectName()); // minioClient.removeObject("spacedata", e.get().objectName()); } catch (InvalidBucketNameException invalidBucketNameException) { invalidBucketNameException.printStackTrace(); } catch (NoSuchAlgorithmException noSuchAlgorithmException) { noSuchAlgorithmException.printStackTrace(); } catch (InsufficientDataException insufficientDataException) { insufficientDataException.printStackTrace(); } catch (IOException ioException) { ioException.printStackTrace(); } catch (InvalidKeyException invalidKeyException) { invalidKeyException.printStackTrace(); } catch (NoResponseException noResponseException) { noResponseException.printStackTrace(); } catch (XmlPullParserException xmlPullParserException) { xmlPullParserException.printStackTrace(); } catch (ErrorResponseException errorResponseException) { errorResponseException.printStackTrace(); } catch (InternalException internalException) { internalException.printStackTrace(); } }); System.out.println(list1.size()); } catch (MinioException e) { System.out.println("Error occurred: " + e); } } /** * 文件流下载(原始文件名) * * @author sunboqiang * @date 2020/10/22 */ public ResponseEntity<byte[]> fileDownload(String url, String fileName, HttpServletRequest request) { return this.downloadMethod(url, fileName, request); } private File getFile(String url, String fileName) { InputStream in = null; // 创建文件 String dirPath = fileName.substring(0, fileName.lastIndexOf("/")); File dir = new File(dirPath); if (!dir.exists()) { dir.mkdirs(); } File file = new File(fileName); try { URL url1 = new URL(url); in = url1.openStream(); // 输入流转换为字节流 byte[] buffer = FileCopyUtils.copyToByteArray(in); // 字节流写入文件 FileCopyUtils.copy(buffer, file); // 关闭输入流 in.close(); } catch (IOException e) { log.error("文件获取失败:" + e); return null; } finally { try { in.close(); } catch (IOException e) { log.error("", e); } } return file; } public ResponseEntity<byte[]> downloadMethod(String url, String fileName, HttpServletRequest request) { HttpHeaders heads = new HttpHeaders(); heads.add(HttpHeaders.CONTENT_TYPE, "application/octet-stream; charset=utf-8"); try { if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { // firefox浏览器 fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), "ISO8859-1"); } else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) { // IE浏览器 fileName = URLEncoder.encode(fileName, "UTF-8"); } else if (request.getHeader("User-Agent").toUpperCase().indexOf("EDGE") > 0) { // WIN10浏览器 fileName = URLEncoder.encode(fileName, "UTF-8"); } else if (request.getHeader("User-Agent").toUpperCase().indexOf("CHROME") > 0) { // 谷歌 fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), "ISO8859-1"); } else { //万能乱码问题解决 fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1); } } catch (UnsupportedEncodingException e) { // log.error("", e); } heads.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + fileName); try { //InputStream in = new FileInputStream(file); URL url1 = new URL(url); InputStream in = url1.openStream(); // 输入流转换为字节流 byte[] buffer = FileCopyUtils.copyToByteArray(in); ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(buffer, heads, HttpStatus.OK); //file.delete(); return responseEntity; } catch (Exception e) { log.error("", e); } return null; }

创建FilesMinioService 服务类

 

  

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.gis.spacedata.common.constant.response.ResponseCodeConst;import com.gis.spacedata.common.domain.ResponseDTO;import com.gis.spacedata.domain.dto.file.vo.UploadVO;import com.gis.spacedata.domain.dto.minio.MinioItem;import com.gis.spacedata.domain.entity.file.FileEntity;import com.gis.spacedata.enums.file.FileServiceTypeEnum;import com.gis.spacedata.handler.SmartBusinessException;import com.gis.spacedata.mapper.file.FileDao;import lombok.extern.slf4j.Slf4j;import org.apache.commons.codec.digest.DigestUtils;import org.apache.commons.lang3.StringUtils;import org.springblade.core.tool.utils.FileUtil;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.http.ResponseEntity;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.stereotype.Service;import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;import java.util.List;import java.util.UUID; @Service@Slf4jpublic class FilesMinioService extends ServiceImpl<FileDao, FileEntity> { @Autowired private MinioTemplate minioTemplate; @Resource private ThreadPoolTaskExecutor taskExecutor; /** * 图片大小限制 **/ @Value("#{${minio.imgSize}}") private Long imgSize; /** * 文件大小限制 **/ @Value("#{${minio.fileSize}}") private Long fileSize; @Value("${minio.bucket}") private String bucket; /** * 下载地址 **/ @Value("${minio.http-url}") private String httpUrl; /** * 判断是否图片 */ private boolean isImage(String fileName) { //设置允许上传文件类型 String suffixList = "jpg,gif,png,ico,bmp,jpeg"; // 获取文件后缀 String suffix = fileName.substring(fileName.lastIndexOf(".") + 1); return suffixList.contains(suffix.trim().toLowerCase()); } /** * 验证文件大小 * * @param upfile * @param fileName 文件名称 * @throws Exception */ private void fileCheck(MultipartFile upfile, String fileName) throws Exception { Long size = upfile.getSize(); if (isImage(fileName)) { if (size > imgSize) { throw new Exception("上传对图片大于:" + (imgSize / 1024 / 1024) + "M限制"); } } else { if (size > fileSize) { throw new Exception("上传对文件大于:" + (fileSize / 1024 / 1024) + "M限制"); } } } /** * 文件上传 * * @author sunboqiang * @date 2020/9/9 */ public ResponseDTO<UploadVO> fileUpload(MultipartFile upfile) throws IOException { String originalFileName = upfile.getOriginalFilename(); try { fileCheck(upfile, originalFileName); } catch (Exception e) { return ResponseDTO.wrap(ResponseCodeConst.ERROR, e.getMessage()); } if (StringUtils.isBlank(originalFileName)) { return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "文件名称不能为空"); } UploadVO vo = new UploadVO(); String url; //获取文件md5,查找数据库,如果有,则不需要上传了 String md5 = DigestUtils.md5Hex(upfile.getInputStream()); QueryWrapper<FileEntity> query = new QueryWrapper<>(); query.lambda().eq(FileEntity::getMd5, md5); query.lambda().eq(FileEntity::getStorageType, FileServiceTypeEnum.MINIO_OSS.getLocationType()); FileEntity fileEntity = baseMapper.selectOne(query); if (null != fileEntity) { //url = minioTemplate.getObjectURL(bucket,fileEntity.getFileName()); vo.setId(fileEntity.getId()); vo.setFileName(originalFileName); vo.setUrl(httpUrl + fileEntity.getFileUrl()); vo.setNewFileName(fileEntity.getFileName()); vo.setFileSize(upfile.getSize()); vo.setFileLocationType(FileServiceTypeEnum.MINIO_OSS.getLocationType()); log.info("文件已上传,直接获取"); return ResponseDTO.succData(vo); } //拼接文件名 String fileName = generateFileName(originalFileName); try { // 检查存储桶是否已经存在 boolean isExist = minioTemplate.bucketExists(bucket); if (isExist) { log.info("Bucket already exists."); } else { // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。 minioTemplate.createBucket(bucket); } // 使用putObject上传一个文件到存储桶中。 minioTemplate.putObj      

	  
	  
	  
	  
	  
	  
        

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • spring编程式事务处理,spring编程事务
  • spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理
  • spring的核心功能模块有几个,列举一些重要的spring模块
  • spring的核心功能模块有几个,列举一些重要的spring模块,七个Spring核心模块详解
  • spring注解和springmvc的注解,SpringMVC常用注解
  • spring注解和springmvc的注解,SpringMVC常用注解,详解springmvc常用5种注解
  • spring实现ioc的四种方法,spring的ioc的三种实现方式
  • spring实现ioc的四种方法,spring的ioc的三种实现方式,简单实现Spring的IOC原理详解
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况,Spring事务失效问题分析及解决方案
  • spring5.0新特性,spring4新特性
  • spring5.0新特性,spring4新特性,spring5新特性全面介绍
  • spring ioc以及aop原理,springmvc aop原理
  • spring ioc以及aop原理,springmvc aop原理,深入浅析Spring 的aop实现原理
  • Spring cloud网关,spring cloud zuul作用
  • 留言与评论(共有 条评论)
       
    验证码: