首页 > 其他分享 >MinIO实现文件上传与下载

MinIO实现文件上传与下载

时间:2023-10-21 17:33:26浏览次数:34  
标签:return MinIO param public bucketName 上传 throws 下载 String

引入依赖

    <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>7.1.0</version>
        </dependency>

 

工具类 MinIoUtils

@Autowired
    SiMinIoProperties minIoProperties;

    private static MinioClient minioClient;


    /**
     * 初始化minio配置
     */
    @PostConstruct
    public void init() {
        try {
            minioClient = new MinioClient(minIoProperties.getEndpoint(), minIoProperties.getAccessKey(), minIoProperties.getSecretKey());
            createBucket(minIoProperties.getBucketName());
        } catch (Exception e) {
            e.printStackTrace();
            log.error("初始化minio配置异常: {}", e.fillInStackTrace());
        }
    }

    /**
     * 判断 bucket是否存在
     *
     * @param bucketName: 桶名
     * @return: boolean
     */
    @SneakyThrows(Exception.class)
    public static boolean bucketExists(String bucketName) {
        return minioClient.bucketExists(bucketName);
    }

    /**
     * 创建 bucket
     *
     * @param bucketName: 桶名
     * @return: void
     */
    @SneakyThrows(Exception.class)
    public static void createBucket(String bucketName) {
        boolean isExist = minioClient.bucketExists(bucketName);
        if (!isExist) {
            minioClient.makeBucket(bucketName);
        }
    }

    /**
     * 获取全部bucket
     *
     * @param :
     * @return: java.util.List<io.minio.messages.Bucket>
     */
    @SneakyThrows(Exception.class)
    public static List<Bucket> getAllBuckets() {
        return minioClient.listBuckets();
    }

    /**
     * 文件上传
     *
     * @param bucketName: 桶名
     * @param fileName:   文件名
     * @param filePath:   文件路径
     * @return: void
     * @date : 2020/8/16 20:53
     */
    @SneakyThrows(Exception.class)
    public static void upload(String bucketName, String fileName, String filePath) {
        minioClient.putObject(bucketName, fileName, filePath, null);
    }

    /**
     * 文件上传
     *
     * @param bucketName: 桶名
     * @param fileName:   文件名
     * @param stream:     文件流
     * @return: java.lang.String : 文件url地址
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, String fileName, InputStream stream) {
        minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
        return getFileUrl(bucketName, fileName);
    }


    /**
     * 上传时指定对应对内容类型
     *
     * @param bucketName  桶名
     * @param folderName  文件夹名
     * @param newFileName 新文件名
     * @param file        文件
     * @return 加密签名的url
     */
    public static String uploadFile(String bucketName, String folderName, String newFileName, MultipartFile file) {
        try {
            //判断桶是否存在
            boolean flag = bucketExists(bucketName);
            if (!flag) {
                createBucket(bucketName);
            }
            //创建文件夹并上传文件
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(folderName + "/" + newFileName)
                    .contentType(ViewContentType.getContentType(file.getOriginalFilename()))
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .build();
            minioClient.putObject(putObjectArgs);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return getFileUrl(bucketName, folderName + newFileName);
    }

    /**
     * 私有上传
     *
     * @param bucketName  桶名
     * @param folderName  文件夹名
     * @param newFileName 新文件名
     * @param file        文件
     * @return
     */
    public static String uploadFilePrivate(String bucketName, String folderName, String newFileName, MultipartFile file) {
        //上传文件
        uploadFile(bucketName, folderName, newFileName, file);
        try {
            //临时签名地址
            return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(bucketName)
                    .object(folderName + "/" + newFileName)
                    .expiry(60)
                    .build());
        } catch (IOException | InvalidKeyException | NoSuchAlgorithmException | ErrorResponseException | ServerException | InsufficientDataException | InvalidResponseException | InternalException | InvalidBucketNameException | InvalidExpiresRangeException | XmlParserException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 文件上传
     *
     * @param bucketName: 桶名
     * @param file:       文件
     * @return: java.lang.String : 文件url地址
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, MultipartFile file) {
        final InputStream is = file.getInputStream();
        final String fileName = file.getOriginalFilename();
        minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
        is.close();
        return getFileUrl(bucketName, fileName);
    }

    /**
     * 删除文件
     *
     * @param bucketName: 桶名
     * @param url:        访问地址
     * @return: void
     */
    @SneakyThrows(Exception.class)
    public static void deleteFile(String bucketName, String url) {
        String objectName = urlAnalyze(url);
        minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }

    /**
     * 获取对象(文件)地址
     *
     * @param bucketName 桶名
     * @param objectName 对象名
     * @return 非签名加密地址
     */
    @SneakyThrows(Exception.class)
    public static String getObjectUrl(String bucketName, String objectName) {
        return minioClient.getObjectUrl(bucketName, objectName);
    }


    /**
     * 获取预签名对象Url
     *
     * @param bucketName       桶名
     * @param url              访问地址
     * @param expiresInSeconds 过期时间(秒)
     * @return
     */
    public static String getPreSignedObjectUrl(String bucketName, String url, int expiresInSeconds) {
        try {
            return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(bucketName)
                    .object(urlAnalyze(url))
                    .expiry(expiresInSeconds)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 地址解析
     *
     * @param url 访问地址
     * @return objectName
     */
    public static String urlAnalyze(String url) {
        // 解析URL
        URL parsedUrl;
        try {
            parsedUrl = new URL(URLDecoder.decode(url, "UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
            return "url转换异常";
        }
        // 提取文件夹名称和对象名称
        String path = parsedUrl.getPath().substring(1);
        String bucketName = "";
        String objectName = "";

        // 如果路径中包含斜杠,则表示存在文件夹
        if (path.contains("/")) {
            bucketName = path.substring(0, path.indexOf("/"));
            objectName = path.substring(path.indexOf("/") + 1);
        } else {
            objectName = path;
        }
        //System.out.println("Bucket名称:" + bucketName);
        //System.out.println("对象名称:" + objectName);
        return objectName;
    }


    /**
     * 获取存储桶中所有对象的名称
     *
     * @param bucketName
     * @return
     * @throws Exception
     */
    public static List<String> listObjects(String bucketName) throws Exception {
        ListObjectsArgs args = ListObjectsArgs.builder()
                .bucket(bucketName)
                .build();
        Iterable<Result<Item>> objects = minioClient.listObjects(args);

        List<String> objectNames = new ArrayList<>();
        for (Result<Item> result : objects) {
            objectNames.add(result.get().objectName());
        }
        return objectNames;
    }


    /**
     * 下载文件
     *
     * @param bucketName: 桶名
     * @param url:        文件访问地址
     * @param response:
     * @return: void
     */
    @SneakyThrows(Exception.class)
    public static void download(String bucketName, String url, HttpServletResponse response) {
        String objectName = urlAnalyze(url);
        // 获取对象的元数据
        final ObjectStat stat = minioClient.statObject(bucketName, urlAnalyze(url));
        response.setContentType(stat.contentType());
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName, "UTF-8"));
        InputStream is = minioClient.getObject(bucketName, objectName);
        is.close();
    }

    /**
     * 获取minio文件的下载地址
     *
     * @param bucketName: 桶名
     * @param objectName: 文件名
     * @return: java.lang.String
     */
    @SneakyThrows(Exception.class)
    public static String getFileUrl(String bucketName, String objectName) {
        return minioClient.presignedGetObject(bucketName, objectName);
    }

    /**
     * @param bucketName 桶名
     * @param folderName 文件夹名称
     * @param file       文件
     * @throws InvalidKeyException
     * @throws ErrorResponseException
     * @throws IllegalArgumentException
     * @throws InsufficientDataException
     * @throws InternalException
     * @throws InvalidBucketNameException
     * @throws InvalidResponseException
     * @throws NoSuchAlgorithmException
     * @throws XmlParserException
     * @throws IOException
     * @throws ServerException
     */
    public static void putObject(String bucketName, String folderName, String newFileName, MultipartFile file)
            throws InvalidKeyException, ErrorResponseException, IllegalArgumentException, InsufficientDataException,
            InternalException, InvalidBucketNameException, InvalidResponseException, NoSuchAlgorithmException,
            XmlParserException, IOException, ServerException {
        //判断桶是否存在
        boolean flag = bucketExists(bucketName);
        if (flag) {
            //王文建文件夹并上传文件
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(folderName + "/" + newFileName)
                    .contentType(ViewContentType.getContentType(file.getOriginalFilename()))
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .build();
            minioClient.putObject(putObjectArgs);
        }
    }


    public ObjectStat statObject(String bucketName, String objectName)
            throws InvalidKeyException, ErrorResponseException, IllegalArgumentException, InsufficientDataException,
            InternalException, InvalidBucketNameException, InvalidResponseException, NoSuchAlgorithmException,
            XmlParserException, IOException {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            ObjectStat statObject = null;
            try {
                statObject = minioClient.statObject(bucketName, objectName);
            } catch (ServerException e) {
                e.printStackTrace();
            }
            return statObject;
        }
        return null;
    }


    /**
     * 创建文件夹
     *
     * @param bucketName
     * @param folderName
     * @return
     * @throws IOException
     * @throws InvalidKeyException
     * @throws InvalidResponseException
     * @throws InsufficientDataException
     * @throws NoSuchAlgorithmException
     * @throws ServerException
     * @throws InternalException
     * @throws XmlParserException
     * @throws InvalidBucketNameException
     * @throws ErrorResponseException
     */
    public static void createFolder(String bucketName, String folderName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException {
        // 创建虚拟文件夹
        String objectName = folderName + "/";

        // 使用空的输入流创建对象
        minioClient.putObject(PutObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .stream(new ByteArrayInputStream(new byte[0]), 0, -1)
                .build());
    }

支持上传文件、下载、访问文件、预签名底子(有效期地址)、对桶的操作

 

配置类SiMinIoProperties

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class SiMinIoProperties {

    /**
     * minio地址+端口号
     */
    private String endpoint;

    /**
     * minio用户名
     */
    private String accessKey;

    /**
     * minio密码
     */
    private String secretKey;

    /**
     * 文件桶的名称
     */
    private String bucketName;

    /**
     * 访问图片有效时间(单位:秒)
     */
    private Integer expiresInSeconds;

}

这里配置在yml配置文件上

注意:minio的用户名和密码,也就是秘钥,在minio控制台获取

桶要设置访问权限为public,不然无法访问! 

 

枚举类ViewContentType

DEFAULT("default","application/octet-stream"),
    JPG("jpg", "image/jpeg"),
    TIFF("tiff", "image/tiff"),
    GIF("gif", "image/gif"),
    JFIF("jfif", "image/jpeg"),
    PNG("png", "image/png"),
    TIF("tif", "image/tiff"),
    ICO("ico", "image/x-icon"),
    JPEG("jpeg", "image/jpeg"),
    WBMP("wbmp", "image/vnd.wap.wbmp"),
    FAX("fax", "image/fax"),
    NET("net", "image/pnetvue"),
    JPE("jpe", "image/jpeg"),
    RP("rp", "image/vnd.rn-realpix"),
    MAP("mp4", "video/mp4"),
    MPEG("mpeg", "video/mpeg"),
    AVI("avi", "video/avi"),
    PDF("pdf", "application/pdf")
    ;

    private String prefix;

    private String type;

    public static String getContentType(String prefix){
        if(StringUtils.isEmpty(prefix)){
            return DEFAULT.getType();
        }
        prefix = prefix.substring(prefix.lastIndexOf(".") + 1);
        for (ViewContentType value : ViewContentType.values()) {
            if(prefix.equalsIgnoreCase(value.getPrefix())){
                return value.getType();
            }
        }
        return DEFAULT.getType();
    }

    ViewContentType(String prefix, String type) {
        this.prefix = prefix;
        this.type = type;
    }

    public String getPrefix() {
        return prefix;
    }

    public String getType() {
        return type;
    }

 

有其它问题请下方留言

 

标签:return,MinIO,param,public,bucketName,上传,throws,下载,String
From: https://www.cnblogs.com/ckfeng/p/17779263.html

相关文章

  • js 大文件切片,中止上传,上传进度,断点续传
    大文件切片上传背景介绍:当涉及大文件上传时,一种有效的方法是将大文件分割成小切片并逐个上传。这种技术不仅可以减轻服务器的负担,还可以避免上传过程中的中断和内存问题。本文将介绍如何使用JavaScript实现大文件切片上传,并解释如何处理断点续传、并发控制以及上传取消等问题,用到......
  • Axure RP8.0 pro中文版下载 Axure8.0中文汉化版安装方法
    AxureRP8.0是一个专业的快速原型设计工具。AxureRP是美国AxureSoftwareSolution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格、设计功能和界面的专家能够快速创建应用软件或Web网站的线框图、流程图、原型和规格说明文档。作为专业的原型设计工具,它能快速、......
  • Adobe Dimension CC2020 Mac「Dn 三维3D建模工具」汉化版下载
    AdobeDimension2020forMac汉化版是Macos上一款三维3D建模工具,操作非常简单,通过强大的3D工具创建产品模型,可视化品牌形像,包装设计,三维模型等。借助AdobeDimension,图形设计师可以在同一个应用程序中编写,调整和渲染逼真的图像。软件地址:看置顶贴AdobeDimensionCC2020Mac安装方......
  • 详解vue大文件视频切片上传的处理方法
    前端上传大文件、视频的时候会出现超时、过大、很慢等情况,为了解决这一问题,跟后端配合做了一个切片的功能,接下来就详细的给大家介绍一下vue大文件视频切片上传的处理方法,需要的朋友可以参考下 前端上传大文件、视频的时候会出现超时、过大、很慢等情况,为了解决这一问题,跟......
  • pr直装版下载-中文正版下载 正版下载
    软件特点智能工具。更好的讲故事。PremierePro被好莱坞电影制作人,电视编辑,YouTubers,摄像师可使用任何有故事要讲的人,包括你。保持您的创意流程。PremierePro是编辑从快速转换电视剧到故事片的所有内容的行业领导者。集成,高效的工作流程可让您在不离开时间表的情况下完善工作。由A......
  • Pr软件中文版下载安装 Pr官方软件下载 正版下载
    AdobePremiereProCC中文精简版是一款适用于专业视频制作与编辑的工具软件,AdobePremiereProCC强大、可自定义、非线性的编辑器,可让您随心所欲地精准编辑视频。PremiereCC提供了几种新功能和增强功能,可充实您的数字视频剪辑体验。软件地址:看置顶帖时间就是一颗药,你掌握好了它......
  • PR软件去哪里下载好?电脑版pr怎么免费下载?正版下载
    PremierePro23.0版专为帮助编辑人员提供出色的字幕工具组合功能,是一款强大的专业视频编辑软件。借助改进功能(如批量编辑时间轴中的标题剪辑、灵活的对齐控件等)简化您的标题和图形工作流程。此版本包含稳定性和性能方面的基础改进,包括更快的动态图形模板和GPU加速的Lumetri范......
  • an软件怎么下载-Adobe Animate(An)软件安装包下载 正版下载
    AdobeAnimate是一种用于创建交互式动画和多媒体内容的应用程序,它可用于设计Web、应用程序和视频游戏中的动画,以及设计交互式内容和富媒体广告。它具有丰富的功能,可以创建各种类型的动画,如传统手绘动画、矢量动画、骨骼动画和动画符号等。除此之外,它还支持JavaScript和HTML5,可以帮......
  • an软件怎么下载|动画设计软件|中文直装版下载 正版下载
    AdobeAnimate(简称AN)是由Adobe公司开发的一款专业动画和交互式媒体设计软件。它的历史可以追溯到1996年,最初是以Flash格式为基础的软件,用于创建网页动画和互动内容。随着技术的发展,AdobeAnimate逐渐扩展了其功能和应用领域。现在,它被广泛应用于游戏开发、动画制作、广告制作等领域......
  • markdown上传csdn调整插入图片大小及位置
    @目录前言1csdn插入图片1.1<img不显示图片?不能使用?2csdn带尺寸的图片3csdn移动图片位置并且带尺寸前言关于markdown上传csdn无法显示本地图片的问题请看我的另一篇文章【2023最新教程】解决markdown上传csdn无法显示本地图片的问题本文章讲叙了自己在markdown上传cs......