zoukankan      html  css  js  c++  java
  • 自建MinIO对象存储服务

    最近买了一个服务器,但没有买OSS,所以想着自己在服务器建立oss。

    MinIO 是一款基于Go语言的高性能对象存储服务,在Github上已有19K+Star。它采用了Apache License v2.0开源协议,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。

    MinIO安装

    使用docker安装,docker的安装就不说了,我之前也有写。

    下载MinIO的Docker镜像:

    docker pull minio/minio

    在Docker容器中运行MinIO

    docker run -p 9090:9000 --name minio 
      -v /mydata/minio/data:/data 
      -v /mydata/minio/config:/root/.minio 
      -d minio/minio server /data

    这里我们将MiniIO的数据和配置文件夹挂在到宿主机上。

    访问 http://192.168.6.132:9090 

    默认Access Key和Secret都是minioadmin

     创建一个bucket

    修改访问策略为只读

     需要注意的是,访问前缀需要设置为*.*,否则会无法访问;

     然后我们整合到项目中去。

    整合使用

    引入依赖

    <!--MinIO JAVA SDK-->
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>3.0.10</version>
    </dependency>

    在SpringBoot中开启文件上传功能

    spring:
      servlet:
        multipart:
          enabled: true #开启文件上传
          max-file-size: 10MB #限制文件上传大小为10M

    默认是1mb。

    一个文件上传的接口:

    
    
    @Value("${minio.endpoint}")
    private String ENDPOINT;
    @Value("${minio.bucketName}")
    private String BUCKET_NAME;
    @Value("${minio.accessKey}")
    private String ACCESS_KEY;
    @Value("${minio.secretKey}")
    private String SECRET_KEY;
        
    @PreAuthorize("hasAuthority('music:add')") @ApiOperation("添加歌曲") @PostMapping("uploadMusic") public CommonResult uploadMusic(@RequestParam("file") MultipartFile file, @ModelAttribute Music music){ try { // 创建一个MinIO的Java客户端 MinioClient minioClient = new MinioClient(ENDPOINT, ACCESS_KEY, SECRET_KEY); boolean isExist = minioClient.bucketExists(BUCKET_NAME); if (isExist) { LOGGER.info("存储桶已经存在!"); } else { //创建存储桶并设置只读权限 minioClient.makeBucket(BUCKET_NAME); minioClient.setBucketPolicy(BUCKET_NAME, "*.*", PolicyType.READ_ONLY); } String fileName = file.getOriginalFilename(); if(fileName == null){ return CommonResult.failed("歌曲名为空"); } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // 设置存储对象名称 String objectName = sdf.format(new Date()) + "/" + fileName; minioClient.putObject(BUCKET_NAME, objectName, file.getInputStream(), file.getContentType()); Music music1 = new Music(); music1.setMusicName(music.getMusicName()); music1.setMusicUrl(ENDPOINT + "/" + BUCKET_NAME + "/" + objectName); music1.setSingerName(music.getSingerName()); musicService.insert(music1); LOGGER.info("上传歌曲路径:" + ENDPOINT + "/" + BUCKET_NAME + "/" + objectName); } catch (Exception e) { LOGGER.info("上传发生错误: {}!", e.getMessage()); e.printStackTrace(); } return CommonResult.success(null); }
  • 相关阅读:
    WCF在tcp通道下启用httpget
    mounted里面this.$refs.xxx的内容是undefined
    小程序和vue的区别
    多维数组扁平化处理
    浏览器事件循环机制(event loop)
    前端优化总结
    vue子组件通知父组件使用方法
    axios拦截器使用方法
    vue-router配置
    斐波那契数列及青蛙跳台阶问题
  • 原文地址:https://www.cnblogs.com/SunSAS/p/13158480.html
Copyright © 2011-2022 走看看