当前位置:

首页 > Springboot怎么整合minio实现文件服务

Springboot怎么整合minio实现文件服务

首先pom文件引入相关依赖io.miniominio3.0.10springboot配置文件application.yml里配置minio信息#minio配置minio:endpoint:http://${minio_host:172.16.10.21}:9000/accessKey:${minio_user:minioadmin}secretKey:${minio_pwd:minioadmin}bucket:${minio_space:spacedata}http-url:http://${minio_

首先pom文件引入相关依赖

        
        
            io.minio
            minio
            3.0.10
        

springboot配置文件application.yml 里配置minio信息

#minio配置
minio:
  endpoint: http://${minio_host:172.16.10.21}:9000/
  accessKey: ${minio_user:minioadmin}
  secretKey: ${minio_pwd:minioadmin}
  bucket: ${minio_space:spacedata}
  http-url: http://${minio_url:172.16.10.21}:9000/
  imgSize: 10485760
  fileSize: 1048576000

创建MinioItem字段项目类

import io.minio.messages.Item;
import io.minio.messages.Owner;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
 
import java.util.Date;
 
@Data
public class MinioItem {
    /**对象名称**/
    @ApiModelProperty("对象名称")
    private String objectName;
    /**最后操作时间**/
    @ApiModelProperty("最后操作时间")
    private Date lastModified;
    private String etag;
    /**对象大小**/
    @ApiModelProperty("对象大小")
    private String size;
    private String storageClass;
    private Owner owner;
    /**对象类型:directory(目录)或file(文件)**/
    @ApiModelProperty("对象类型:directory(目录)或file(文件)")
    private String type;
 
    public MinioItem(String objectName, Date lastModified, String etag, String size, String storageClass, Owner owner, String type) {
        this.objectName = objectName;
        this.lastModified = lastModified;
        this.etag = etag;
        this.size = size;
        this.storageClass = storageClass;
        this.owner = owner;
        this.type = type;
    }
 
 
    public MinioItem(Item item) {
        this.objectName = item.objectName();
        this.type = item.isDir() ? "directory" : "file";
        this.etag = item.etag();
        long sizeNum = item.objectSize();
        this.size = sizeNum > 0 ? convertFileSize(sizeNum):"0";
        this.storageClass = item.storageClass();
        this.owner = item.owner();
        try {
            this.lastModified = item.lastModified();
        }catch(NullPointerException e){}
    }
 
    public String convertFileSize(long size) {
        long kb = 1024;
        long mb = kb * 1024;
        long gb = mb * 1024;
        if (size >= gb) {
            return String.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
@RequiredArgsConstructor
public 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
     * 

     * https://docs.minio.io/cn/java-client-api-reference.html#listBuckets      */     @SneakyThrows     public List getAllBuckets() {         return minioClient.listBuckets();     }       /**      * 根据bucketName获取信息      *      * @param bucketName bucket名称      */     @SneakyThrows     public Optional 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 getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {         List objectList = new ArrayList<>();         Iterable> objectsIterator = minioClient.listObjects(bucketName, prefix, recursive);         for (Result 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> 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> 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> list = minioClient.listObjects("spacedata", "CompileResult/");             List 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 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 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 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
@Slf4j
public class FilesMinioService extends ServiceImpl {
 
    @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 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 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.putObject(bucket, fileName, upfile.getInputStream());
            log.info("上传成功.");
            //生成一个外部链接
            //url = minioTemplate.getObjectURL(bucket,fileName);
            //已经设置永久链接,直接获取
            url = httpUrl + bucket + "/" + fileName;
            fileEntity = new FileEntity();
            fileEntity.setStorageType(FileServiceTypeEnum.MINIO_OSS.getLocationType());
            fileEntity.setFileName(fileName);
            fileEntity.setOriginalFileName(originalFileName);
            fileEntity.setFileUrl(bucket + "/" + fileName);
            fileEntity.setFileSize(upfile.getSize());
            fileEntity.setMd5(md5);
            baseMapper.insert(fileEntity);
        } catch (Exception e) {
            return ResponseDTO.wrap(ResponseCodeConst.ERROR, "上传失败!");
        }
        vo.setFileName(originalFileName);
        vo.setId(fileEntity.getId());
        vo.setUrl(url);
        vo.setNewFileName(fileName);
        vo.setFileSize(upfile.getSize());
        vo.setFileLocationType(FileServiceTypeEnum.MINIO_OSS.getLocationType());
 
        return ResponseDTO.succData(vo);
    }
 
    /**
     * 生成文件名字
     * 当前年月日时分秒 +32位 uuid + 文件格式后缀
     *
     * @param originalFileName
     * @return String
     */
    private String generateFileName(String originalFileName) {
        String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String fileType = originalFileName.substring(originalFileName.lastIndexOf("."));
        return time + "/" + uuid + fileType;
    }
 
    /**
     * 文件上传(不做重复校验)
     *
     * @author sunboqiang
     * @date 2020/9/25
     */
    public ResponseDTO fileUploadRep(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
        FileEntity fileEntity = new FileEntity();
        //拼接文件名
        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.putObject(bucket, fileName, upfile.getInputStream());
            log.info("上传成功.");
            //生成一个外部链接
            //url = minioTemplate.getObjectURL(bucket,fileName);
            //已经设置永久链接,直接获取
            url = httpUrl + bucket + "/" + fileName;
            fileEntity.setStorageType(FileServiceTypeEnum.MINIO_OSS.getLocationType());
            fileEntity.setFileName(fileName);
            fileEntity.setOriginalFileName(originalFileName);
            fileEntity.setFileUrl(bucket + "/" + fileName);
            fileEntity.setFileSize(upfile.getSize());
            baseMapper.insert(fileEntity);
        } catch (Exception e) {
            return ResponseDTO.wrap(ResponseCodeConst.ERROR, "上传失败!");
        }
        vo.setFileName(originalFileName);
        vo.setId(fileEntity.getId());
        vo.setUrl(url);
        vo.setNewFileName(fileName);
        vo.setFileSize(upfile.getSize());
        vo.setFileLocationType(FileServiceTypeEnum.MINIO_OSS.getLocationType());
 
        return ResponseDTO.succData(vo);
    }
 
    /**
     * 文件流上传(不存数据库)
     *
     * @author sunboqiang
     * @date 2020/9/25
     */
    public ResponseDTO uploadStream(InputStream inputStream, String originalFileName) {
        UploadVO vo = new UploadVO();
        String url;
        //文件名
        String fileName = originalFileName;
        try {
            // 检查存储桶是否已经存在
            boolean isExist = minioTemplate.bucketExists(bucket);
            if (isExist) {
                log.info("Bucket already exists.");
            } else {
                // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
                minioTemplate.createBucket(bucket);
            }
            // 使用putObject上传一个文件到存储桶中。
            minioTemplate.putObject(bucket, fileName, inputStream);
            log.info("上传成功.");
            //生成一个外部链接
            //url = minioTemplate.getObjectURL(bucket,fileName);
            //已经设置永久链接,直接获取
            url = httpUrl + bucket + "/" + fileName;
        } catch (Exception e) {
            return ResponseDTO.wrap(ResponseCodeConst.ERROR, "上传失败!");
        }
        vo.setFileName(originalFileName);
        vo.setUrl(url);
        vo.setNewFileName(fileName);
        vo.setFileLocationType(FileServiceTypeEnum.MINIO_OSS.getLocationType());
 
        return ResponseDTO.succData(vo);
    }
 
    private String generateFileNameTwo(String originalFileName) {
        String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        return time + "/" + originalFileName;
    }
 
    /**
     * 文件查询
     *
     * @author sunboqiang
     * @date 2020/9/25
     */
    public ResponseDTO findFileById(Long id) {
        FileEntity fileEntity = baseMapper.selectById(id);
        if (null == fileEntity) {
            return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "文件不存在");
        }
        UploadVO vo = new UploadVO();
        /*String url = minioTemplate.getObjectURL(bucket,fileEntity.getFileName());
        if(StringUtils.isEmpty(url)){
            return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM,"获取minio 文件url失败!");
        }*/
        vo.setFileName(fileEntity.getOriginalFileName());
        vo.setUrl(httpUrl + fileEntity.getFileUrl());
        vo.setNewFileName(fileEntity.getFileName());
        vo.setFileSize(fileEntity.getFileSize());
        vo.setFileLocationType(FileServiceTypeEnum.MINIO_OSS.getLocationType());
        return ResponseDTO.succData(vo);
    }
 
 
    /**
     * 文件流式下载
     *
     * @author sunboqiang
     * @date 2020/10/22
     */
    public ResponseEntity downLoadFile(Long id, HttpServletRequest request) {
        FileEntity fileEntity = baseMapper.selectById(id);
        if (null == fileEntity) {
            throw new SmartBusinessException("文件信息不存在");
        }
        if (StringUtils.isEmpty(fileEntity.getFileUrl())) {
            throw new SmartBusinessException("文件url为空");
        }
        ResponseEntity stream = minioTemplate.fileDownload(httpUrl + fileEntity.getFileUrl(), fileEntity.getOriginalFileName(), request);
        return stream;
    }
 
    /**
     * 文件删除(通过文件名)
     *
     * @author tarzan Liu
     * @date 2020/11/11
     */
    public ResponseDTO deleteFiles(List fileNames) {
        try {
            for (String fileName : fileNames) {
                minioTemplate.removeObject(bucket, fileName);
            }
        } catch (Exception e) {
            return ResponseDTO.wrap(ResponseCodeConst.ERROR, e.getMessage());
        }
        return ResponseDTO.succ();
    }
 
    /**
     * tarzan LIU
     *
     * @author tarzan Liu
     * @date 2020/11/11
     */
    public ResponseDTO downloadTargetDir(String objectName, String dirPath) {
        minioTemplate.downloadTargetDir(bucket, objectName, dirPath);
        return ResponseDTO.succ();
    }
 
    /**
     * 下载备份编译结果
     *
     * @param dirPath
     * @return {@link Boolean}
     * @author zhangpeng
     * @date 2021年10月15日
     */
    public Boolean downloadCompile(String dirPath) {
        if (!minioTemplate.bucketExists(bucket)) {
            log.info("Bucket not exists.");
            return true;
        }
 
        List list = minioTemplate.getAllObjectsByPrefix(bucket, "CompileResult/", true);
        list.forEach(e -> {
            String url = minioTemplate.getObjectUrl(bucket, e.getObjectName());
            InputStream minioStream = minioTemplate.getObject(bucket, e.getObjectName());
            File file = new File(dirPath + url.substring(url.indexOf("CompileResult")-1));
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            FileUtil.toFile(minioStream, file);
        });
 
        log.info("downloadCompile complete.");
        return true;
    }

部分操作数据库的相关代码省略,不再展示

创建FilesMinioController 服务接口

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.gis.spacedata.common.anno.NoNeedLogin;
import com.gis.spacedata.common.domain.ResponseDTO;
import com.gis.spacedata.domain.dto.file.vo.UploadVO;
import com.gis.spacedata.service.file.FilesMinioService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
 
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
 
@Api(tags = {"minio文件服务"})
@RestController
public class FilesMinioController {
 
    @Autowired
    private FilesMinioService filesMinioService;
 
 
    @ApiOperation(value = "文件上传(md5去重上传) by sunboqiang")
    @PostMapping("/minio/uploadFile/md5")
    @NoNeedLogin
    public ResponseDTO uploadFile(MultipartFile file) throws IOException {
        return filesMinioService.fileUpload(file);
    }
 
    @ApiOperation(value = "文件上传(不做重复校验) by sunboqiang")
    @PostMapping("/minio/uploadFile/noRepeatCheck")
    public ResponseDTO fileUploadRep(MultipartFile file) throws IOException {
        return filesMinioService.fileUploadRep(file);
    }
 
    @ApiOperation(value = "文件流上传 by sunboqiang")
    @PostMapping("/minio/uploadFile/stream/{fileName}")
    public ResponseDTO uploadStream(InputStream inputStream, @PathVariable("fileName") String fileName) throws IOException {
        return filesMinioService.uploadStream(inputStream, fileName);
    }
 
    @ApiOperation(value = "文件查询(永久链接) by sunboqiang")
    @GetMapping("/minio/getFileUrl/{id}")
    public ResponseDTO findFileById(@PathVariable("id") Long id) {
        return filesMinioService.findFileById(id);
    }
 
    @ApiOperation(value = "文件流式下载 by sunboqiang")
    @GetMapping("/minio/downloadFile/stream")
    public ResponseEntity downLoadFile(@RequestParam Long id, HttpServletRequest request) {
        return filesMinioService.downLoadFile(id, request);
    }
 
    @ApiOperation(value = "文件删除(通过文件名) by sunboqiang")
    @PostMapping("/minio/deleteFiles")
    public ResponseDTO deleteFiles(@RequestBody List fileNames) {
        return filesMinioService.deleteFiles(fileNames);
    }
}
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
相关文章 更多
using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

c语言函数递归 怎么选?常见方案对比分析
c语言函数递归 怎么选?常见方案对比分析

递归函数的基本概念与适用场景在C语言编程中,递归是一种函数调用自身的编程技巧。它并非适用于所有问题,但在处理某些具有自相似结构的问题时,能提供极其清晰和优雅的解决方案。递归的核心思想是将一个大规模问题分解为一个或多个同类型但规模更小的子问题,直到子问题简单到可以直接求解。典型的适用场景包括树形结构的

Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解
Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解

理解内存管理的基石在Objective-C的编程世界中,内存管理是开发者必须掌握的核心技能之一。它直接关系到应用的性能、稳定性与资源利用效率。与一些采用自动垃圾回收机制的语言不同,Objective-C在很长一段时间里,依赖一套基于引用计数的、需要开发者部分介入的管理规则。这套规则的核心思想是明确的

如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏
如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏

理解 dealloc 的角色与时机在 iOS 应用开发中,内存管理是保障应用性能与稳定性的基石。dealloc 方法是 Objective-C 中对象生命周期结束时的关键回调,它标志着对象即将被系统回收内存。正确理解其触发时机至关重要:当一个对象的引用计数降为零时,运行时系统会自动调用该对象的 de

深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制
深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制

内存管理的基石在Objective-C的世界里,内存管理是开发者必须掌握的核心技能之一。作为一门在手动引用计数(MRC)时代诞生的语言,Objective-C要求程序员对对象的生命周期有清晰的认识。dealloc方法正是这一生命周期中至关重要的终点站。它是一个实例方法,当对象的引用计数降为零时,系统

理解 native2ascii:Java 国际化开发中的字符编码工具
理解 native2ascii:Java 国际化开发中的字符编码工具

native2ascii 工具的基本定位在Ja va应用程序的国际化与本地化开发过程中,处理非拉丁字符集是一个常见且关键的环节。Ja va内部使用Unicode字符集来统一表示全球各种语言的文字,但其属性文件(.properties)在历史上要求使用ASCII编码,或者更准确地说,要求非ASCII字

如何使用 native2ascii 转换中文字符为 Unicode 转义序列
如何使用 native2ascii 转换中文字符为 Unicode 转义序列

理解 native2ascii 工具的基本用途在软件开发,特别是涉及国际化处理的场景中,开发者常常需要处理不同编码的文本资源。native2ascii 是 Ja va 开发工具包(JDK)中提供的一个命令行实用程序,其主要功能是将包含本地字符编码(非ASCII字符)的文件,转换为包含 Unicode

Java native2ascii 命令详解:解决属性文件乱码问题
Java native2ascii 命令详解:解决属性文件乱码问题

native2ascii 命令的由来与作用在Ja va开发中,处理国际化资源文件是一个常见需求。资源文件通常以.properties格式存储,用于支持多语言界面。然而,Ja va属性文件默认采用ISO-8859-1字符集编码,这导致了一个直接的问题:当文件中包含非拉丁字符(如中文、日文、韩文等)时,

一个 memwatch 实战案例:定位野指针问题
一个 memwatch 实战案例:定位野指针问题

内存监控工具的价值与挑战在软件开发,尤其是使用C/C++这类手动管理内存的语言时,内存错误是程序员最常遭遇的难题之一。其中,野指针问题因其隐蔽性和破坏性,往往成为最难定位的“幽灵”缺陷。它可能潜伏在代码中,在特定条件下才被触发,导致程序崩溃、数据损坏或难以预测的行为。传统的调试手段,如打印日志或使用

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。