java实现文件上传到minio

1.docker安装minio

1.1 下载minio镜像

docker pull minio/minio

1.2 创建并启动minIO容器

docker run -p 9000:9000 -p 9090:9090 
 --name minio 
 -d --restart=always 
 -e "MINIO_ACCESS_KEY=minioadmin" 
 -e "MINIO_SECRET_KEY=minioadmin" 
 -v /mydata/minio/data:/data 
 minio/minio server 
 /data --console-address ":9090" -address ":9000"

这里的 指的是命令还没有输入完,还需要继续输入命令,先不要执行的意思。
这里的9090端口指的是minio的客户端端口。虽然设置9090,但是我们在访问9000的时候,他也会自动跳到9090。
9000端口是minio的服务端端口,我们程序在连接minio的时候,就是通过这个端口来连接的。
-v就是docker run当中的挂载,这里的/mydata/minio/data:/data意思就是将容器的/data目录和宿主机的/mydata/minio/data目录做映射,这样我们想要查看容器的文件的时候,就不需要看容器当中的文件了。
注意在执行命令的时候,他是会自动在宿主机当中创建目录的。我们不需要手动创建。
minio所上传的文件默认都是存储在容器的data目录下的!
假如删除容器了宿主机当中挂载的目录是不会删除的。假如没有使用-v挂载目录,那他在宿主机的存储位置的文件会直接删除的。
宿主机的挂载目录一定是根目录,如果是相对路径会有问题。还有容器当中的目录也是必须是绝对路径(根路径就是带/的)。
所谓的挂载其实就是将容器目录和宿主机目录进行绑定了,操作宿主机目录,容器目录也会变化,操作容器目录,宿主机目录也会变化。这样做的目的 可以间接理解为就是数据持久化,防止容器误删,导致数据丢失的情况。
MINIO_ACCESS_KEY:账号

MINIO_SECRET_KEY:密码 (正常账号应该不低于3位,密码不低于8位,不然容器会启动不成功)
–console-address 指定客户端端口
-d –restart=always 代表重启linux的时候容器自动启动
–name minio 容器名称

2.创建桶并调整policy为public

浏览器输入http://ip:9090进入minio,输入账号密码登录。

点击此处创建桶

创建好桶后,点击桶进入详情页

把上面框住的地方改为public,不然不能从外面访问到桶里的图片

3.java配置依赖

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

这里可能会出现minio和okhttp3的冲突,是因为每个版本的minio依赖对应一个okhttp版本,所以可以进入minio的pom里查看对应的okhttp版本。minio8.3.0对应的okhttp3版本是4.8.1,我们可以在pom中加入okhttp3的依赖来下载这个依赖

<dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>4.8.1</version>
      <scope>compile</scope>
    </dependency>

4.代码实现

在minio里生成accesskey和screctkey

在此处生成ak和sk,记得保存(不保存也没事,大不了重新生成)

在controller里初始化minio客户端

// 初始化MinIO客户端
    final String accessKey = "your accesskey";
    final String secretKey = "your screctkey";
    final String bucketName = "your bucketname";
    final String url="http://ip:9000/";
    MinioClient minioClient = MinioClient.builder()
            .endpoint("http://ip:9000") // 替换为您的MinIO服务器URL
            .credentials(accessKey, secretKey)
            .build();

下面是图片上传的方法实现

@PostMapping("upload")
    public R uploadFile(HttpServletRequest request) throws ServletException, IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        Part part = request.getPart("file");
        int i = abs(RandomUtil.randomInt());
        String name=i+".jpg";
//        System.out.println(part.getSize());

        PutObjectArgs args=PutObjectArgs.builder().bucket(bucketName).object(name).stream(part.getInputStream(), part.getSize(), -1).contentType(part.getContentType()).build();
        minioClient.putObject(args);
        return R.success(url+bucketName+'/'+name);
    }

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注