栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot 集成 minio分享以及小坑 和 单机部署

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot 集成 minio分享以及小坑 和 单机部署

第一步先引入minio依赖



   io.minio
   minio
   8.2.1
   
      
         com.squareup.okhttp3
         okhttp
      
   



   com.squareup.okhttp3
   okhttp
   3.12.0

这里强制修改okhttp3的版本是因为,有时会存在jar包冲突的问题,导致文件上传报错

java.lang.NoSuchMethodError: okhttp3.Headers.iterator()Ljava/util/Iterator;

我最开始在单体项目中测试上传的时候只引入了下面这个依赖,上传,删除,下载都没问题


   io.minio
   minio
   8.0.3

然后把代码迁入微服务后,上传就报上面那个错误,然后检查半天,可能时jar包冲突,如果报错可以尝试降低版本,minio和boot的版本也存在一些关系,大家可以百度一下。

接下来在yml中配置变量

#minio本地测试
minio:
  minioUrl: http://ip:端口
  userName: minio后台账号
  passWrod: 密码
  bucketName: minio中桶

配置config

@Data
@Component
public class MinIoClientConfig {
    @Value("${minio.minioUrl}")
    private String minioUrl;
    @Value("${minio.userName}")
    private String userName;
    @Value("${minio.passWrod}")
    private String passWrod;


    
    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint(minioUrl)
                .credentials(userName, passWrod)
                .build();
    }

}

Controller层

返回体改成自己的就行

@RestController
@RequestMapping("/minio")
public class MinioController {

    @Autowired
    private MinioClient minioClient;

    @Value("${minio.bucketName}")
    private String bucketName;

    @Value("${minio.minioUrl}")
    private String url;

    //上传文件,返回生成的访问地址
    @PostMapping("/uploadlist")
    public ApiResult uploadlist(MultipartFile file){

        String orgfileName = file.getOriginalFilename();
        //文件名加上uuid防止重复文件名
        String exts = orgfileName.substring(orgfileName.lastIndexOf(".") + 1);
        String substring = orgfileName.substring(0,orgfileName.indexOf("."));
        orgfileName =substring+UUID.randomUUID().toString() + "." + exts;
        try {
            //文件上传
            InputStream in = file.getInputStream();
            minioClient.putObject(
                    PutObjectArgs.builder().bucket(bucketName).object(orgfileName).stream(
                            in, file.getSize(), -1)
                            .contentType(file.getContentType())
                            .build());
            in.close();
        } catch (Exception e) {
            return new ApiResult<>("上传失败");
        }
        String fileUrl = url+"/"+bucketName+"/"+orgfileName;

        return new ApiResult<>(fileUrl);
    }
我这里文件上传后返回的地址,可以在浏览器里直接访问到,是需要在minio后台配置公共的访问方式,就可以了如果考虑安全问题,或者是想把文件分享给第三方,可以生成有一个临时的url,即使时私有的也能访问,不过链接有时间限制,会过期。

    @GetMapping("/url")
    public String getObjectUrl(String fileName) throws Exception {
        // 创建参数
        GetPresignedObjectUrlArgs presignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()
                .bucket(bucketName)
                .object(fileName) // 文件名字
                .method(Method.GET) // http请求方式
                .expiry(5, TimeUnit.MINUTES) // url过期时间
                .build();
        return minioClient.getPresignedObjectUrl(presignedObjectUrlArgs);
    }
}



    
    @PostMapping("/delete/{fileName}")
    public ApiResult delete(@PathVariable("fileName") String filename){
        try {
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName)
                    .object(filename).build());
        }catch (Exception e){
            e.getMessage();
            return new ApiResult("删除失败");
        }
        return new ApiResult("删除成功");
    }

    //获取上传文件列表
    @GetMapping("/list")
    public ApiResult> list() {
        List result = new ArrayList<>();
        // 获取bucket中的文件对象列表
        ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(bucketName).build();
        Iterable> objects = minioClient.listObjects(listObjectsArgs);
        objects.forEach(obj -> {
            try {
                Item item = obj.get();
                result.add(item.objectName());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        return new ApiResult<>(result);
    }




    
    @GetMapping("/download/{filename}")
    public void download(@PathVariable String filename, HttpServletResponse response){
        InputStream in = null;
        try {
            //获取对象信息
            StatObjectResponse stat = minioClient.statObject(
                    StatObjectArgs.builder().bucket(bucketName).object(filename).build());
            response.setContentType(stat.contentType());
            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filename, "utf-8"));
            //文件下载
            in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(filename).build());
            IOUtils.copy(in, response.getOutputStream());
        }catch (Exception e){
            e.getMessage();
        }finally {
            if(in != null){
                try {
                    in.close();
                }catch (IOException e){
                    e.getMessage();
                }
            }
        }
    }
}

 minio单机部署

先创建/minio文件夹  再把二进制流的minio文件放在里面(minio通过命令下载 )

然后minio文件夹中创建data文件夹,放后续上传的文件

接下来

输入 chmod +x minio 

输入nohup /minio/minio server --address '0.0.0.0:9000' --console-address '0.0.0.0:9001'  /minio/data &

Minio的默认地址端口是9000 可以通过--address '0.0.0.0:9000'修改默认端口

如果9000端口被占用可以修改

--console-address '0.0.0.0:9001' 设置静态端口,通过静态端口访问,如果不设置静态端口会有警告,也会导致minio访问失败

访问minio后台可以用默认端口 也可以用静态  http:// ip+端口

登录账号密码 minioadmin  minioadmin

修改原始的密码 可以在data的隐藏文件夹中修改,这里就不多说。

进来之后可以在这儿新建桶,来存放文件。

这里可以新增用户,并且授权,minio这一块还是做得非常可以

还有什么东西大家就自己摸索吧,探索才是代码人的乐趣。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/969501.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号