数据结构 js快速排序 database elasticsearch flask kubernetes service lua 安卓项目实战 jq获取元素宽度 mysql数据库驱动 webapp打包 idea开发python python随机函数 python日期转时间戳 java正则 java教材 java环境变量配置 java输出数组 java怎么输出数组 java配置文件 javascript源代码 网站后台模板 战地女记者 莫莫小工具 js四舍五入 摩斯密码翻译 快点蛆虫成就单刷 gilisoft vbs编程教学 混沌世界隐藏英雄密码 摩尔斯电码翻译器在线 陌陌电脑直播设置教程 华为ff 机械键盘个别键位失灵 保留小数点后两位 小度音箱app pr蒙版怎么用 透视网格工具怎么取消 剑灵龙骨卷轴
当前位置: 首页 > 学习教程  > 编程语言

MinIO 文件服务器使用笔记

2020/11/4 14:48:20 文章标签:

官网SDK没更新,真坑啊,都是不能用和过期的 看的大佬的文章,讲的特别清楚:https://www.jianshu.com/p/913a069e755a 根据自己需求简单处理记录 配置文件 spring:application:name: aaaminio:configs:#你搭建的MinIO服务器地址m…

官网SDK没更新,真坑啊,都是不能用和过期的

看的大佬的文章,讲的特别清楚:https://www.jianshu.com/p/913a069e755a

根据自己需求简单处理记录

配置文件

spring:
  application:
    name: aaa
  minio:
    configs:
      #你搭建的MinIO服务器地址
      minIOUrl: http://22.22.22.22:8080
      #你搭建的MinIO服务器账号
      accessKey: M9999		
       #你搭建的MinIO服务器密码
      secretKey: 123456
      #文件大小 单位M
      maxFileSize: 10
      #签名有效时间  单位秒
      expires: 36000

配置文件映射实体类

@Data
@Component
@ConfigurationProperties(prefix = "spring.minio.configs")
public class MinIoFileProperties {
    private String minIOUrl;
    private String accessKey;
    private String secretKey;
    private Integer maxFileSize;
    private Integer expires;
}

封装工具类

/**
 * minio 图片服务器
 */
@Slf4j
public class MinIoFileUtil {
    private static final String NAME_HEAD = "J";

    //MinIO服务的URL
    private static String minIOUrl;
    //Access key
    private static String accessKey;
    //Secret key
    private static String secretKey;
    //存储桶名称
    private static String bucketName;
    //文件大小(最大)
    private static Integer maxFileSize = 10;
    //签名有效时间  单位秒
    private static Integer expires;

    public MinIoFileUtil() {
    }


    public MinIoFileUtil(String bucketName, MinIoFileProperties minIoFileProperties) {
        this.minIOUrl = minIoFileProperties.getMinIOUrl();
        this.accessKey = minIoFileProperties.getAccessKey();
        this.secretKey = minIoFileProperties.getSecretKey();
        this.bucketName = bucketName;
        this.maxFileSize = minIoFileProperties.getMaxFileSize();
        this.expires = minIoFileProperties.getExpires();
    }

    /**
     * 获取文件签名url
     *
     * @param fileName 文件名称
     * @return 文件签名地址
     */
    public static String getSignedUrl(String fileName) throws Exception {
        if (StringUtils.isBlank(fileName)){
            throw new MinIoFileException("文件名称错误");
        }
        MinioClient client = MinioClient.builder().endpoint(minIOUrl).credentials(accessKey, secretKey).build();
        return client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(fileName).expiry(expires).build());
    }


    /**
     * 返回文件URL
     *
     * @return
     */
    public static String setFile(MultipartFile multipartFile) throws IOException {
        return uploadFiles(setFileName(null), fileVerify(multipartFile));
    }


    /**
     * 返回文件URL
     *
     * @return
     */
    public static String setFile(InputStream inputStream) {
        return uploadFiles(setFileName(null), inputStream);
    }

    /**
     * 返回文件URL
     *
     * @return
     */
    public static String setFile(String fileName, InputStream inputStream) {
        return uploadFiles(setFileName(fileName), inputStream);
    }

    /**
     * 返回文件URL
     *
     * @return
     */
    public static String setFile(String fileName, MultipartFile multipartFile) throws IOException {
        return uploadFiles(setFileName(fileName), fileVerify(multipartFile));
    }


    /**
     * 文件校验
     */
    private static InputStream fileVerify(MultipartFile multipartFile) throws IOException {
        if (null == multipartFile) {
            throw new MinIoFileException("请选择文件");
        }
        // 文件不大于10M
        if (!checkFileSize(multipartFile.getSize(), maxFileSize, "M")) {
            throw new MinIoFileException("文件大小超限制");
        }
        return multipartFile.getInputStream();
    }


    /**
     * 上传文件 (流的形式)
     *
     * @return
     */
    private static String uploadFiles(String fileName, InputStream inputStream) {
        try {
            MinioClient client = MinioClient.builder().endpoint(minIOUrl).credentials(accessKey, secretKey).build();
            makeBucket(client, bucketName);
            client.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(inputStream, inputStream.available(), -1).build());
//            client.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(inputStream, inputStream.available(), -1).contentType("image/png").build());
            return getObjectPrefixUrl(bucketName) + fileName;
        } catch (MinioException e) {
            log.info("上传文件异常{}", e);
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            log.info("上传文件异常{}", e);
            e.printStackTrace();
        } catch (IOException e) {
            log.info("上传文件异常{}", e);
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            log.info("上传文件异常{}", e);
            e.printStackTrace();
        } catch (Exception e) {
            log.info("上传文件异常{}", e);
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 校验创建桶
     *
     * @param bucketName 桶
     */
    private static void makeBucket(MinioClient minioClient, String bucketName) throws Exception {
        // 判断桶是否存在
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (!isExist) {
            log.info("存储桶{}不存在", bucketName);
            // 新建桶
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            log.info("新建存储桶{}", bucketName);
        }
    }


    /**
     * 文件url前半段
     *
     * @param bucket 桶
     * @return 前半段
     */
    private static String getObjectPrefixUrl(String bucket) {
        return String.format("%s/%s/", minIOUrl, bucket);
    }


    private static String setFileName(String fileName) {
        if (StringUtils.isNotBlank(fileName)) {
            return fileName;
        }
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        return NAME_HEAD + simpleDateFormat.format(new Date()) + getRandom();
    }

    private static int getRandom() {
        double ran = Math.random() * 9000 + 1000;
        return (int) ran;
    }


    /**
     * 判断文件大小
     *
     * @param len
     *            文件长度
     * @param size
     *            限制大小
     * @param unit
     *            限制单位(B,K,M,G)
     * @return
     */
    public static boolean checkFileSize(Long len, int size, String unit) {
//        long len = file.length();
        double fileSize = 0;
        if ("B".equals(unit.toUpperCase())) {
            fileSize = (double) len;
        } else if ("K".equals(unit.toUpperCase())) {
            fileSize = (double) len / 1024;
        } else if ("M".equals(unit.toUpperCase())) {
            fileSize = (double) len / 1048576;
        } else if ("G".equals(unit.toUpperCase())) {
            fileSize = (double) len / 1073741824;
        }
        if (fileSize > size) {
            return false;
        }
        return true;
    }

调用

/**
     * 上传图片
     * @param file
     * @return
     * @throws IOException
     */
    @GetMapping("/setFile")
    @ApiOperation(httpMethod = "Get", value = "setFile")
    public Wrapper setFile(@RequestParam(value = "file", required = false) MultipartFile file) throws IOException {
    	//第一个参数桶的名称, 第二个为配置文件
        MinIoFileUtil minIoFileUtil = new MinIoFileUtil("test", minIoFileProperties);
        String s = minIoFileUtil.setFile(file.getName(),file);
        System.out.println(s);
        return WrapMapper.ok();
    }


    /**
     * 获取图片访问路径
     * @return
     * @throws Exception
     */
    @GetMapping("/getFileUrl")
    @ApiOperation(httpMethod = "Get", value = "getFileUrl")
    public Wrapper getFileUrl() throws Exception {
    	//第一个参数桶的名称, 第二个为配置文件
        MinIoFileUtil minIoFileUtil = new MinIoFileUtil("test", minIoFileProperties);
        String s = minIoFileUtil.getSignedUrl("aaa.jpg");
        System.out.println(s);
        return WrapMapper.ok();
    }

本文链接: http://www.dtmao.cc/news_show_350210.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?