IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> java 调用 minio -> 正文阅读

[开发工具]java 调用 minio

pom 文件 添加依赖

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

如果使用 8.3后的版本会报错

The following method did not exist:
okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody;
The calling method’s class, io.minio.S3Base, was loaded from the following location

原因是需要自行添加 okhttp 依赖

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

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.3</version>
</dependency>

application.yml 添加 minio 配置
注意:这里的 url 是 映射 minio 9000 端口的域名,accessKey 和 secretKey 在 Service Accounts 那一步创建

s3:
  url: "http://shareminio.saas.api.gd-xxx.com"
  accessKey: "zNsFa5x60rWKp4KK"
  secretKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

配置 StorageProperty

@Data
@ConfigurationProperties(prefix = "s3")
public class StorageProperty {
    private String url;
    private String accessKey;
    private String secretKey;
    private long callTimeOut = 60000;
    private long readTimeOut = 300000;
}

配置 MinioClientConfig

@Configuration
public class MinioClientConfig {

    @Autowired
    private StorageProperty storageProperty;

    @Bean
    public OkHttpClient httpClient() {
        OkHttpClientFactory okHttpClientFactory = new DefaultOkHttpClientFactory(new OkHttpClient().newBuilder());
        return okHttpClientFactory.createBuilder(true)
                .retryOnConnectionFailure(true)
                .callTimeout(storageProperty.getCallTimeOut(), TimeUnit.MILLISECONDS)
                .readTimeout(storageProperty.getReadTimeOut(), TimeUnit.MILLISECONDS)
                .build();
    }
    
    @Bean(name = {"minioClient"})
    public MinioClient minioClient() {
        OkHttpClient client = httpClient();
        return MinioClient
                .builder().httpClient(client)
                .endpoint(storageProperty.getUrl())
                .credentials(storageProperty.getAccessKey(), storageProperty.getSecretKey())
                .build();
    }
}

minio 上传

public void upload(String repository, String path, String fileName, MultipartFile file) throws Exception {
    minioClient.putObject(PutObjectArgs.builder()
       .bucket(repository)
       .object(path + fileName)
       .stream(file.getInputStream(), file.getSize(), -1)
       .build());
}

minio 下载,获取文件流

public InputStream download(String repository, String path, String fileName) {
   try {
       InputStream inputStream =
               minioClient.getObject(GetObjectArgs.builder().bucket(repository).object(path + fileName).build());
       return inputStream;
   } catch (Exception e) {
       e.printStackTrace();
       throw new BaseException("DOWNLOAD_FROM_MINIO_FAILED", "下载出错!", e);
   }
}

minio 下载,获取 url

/**
 * 获取下载链接
 *
 * @param repository    存储的仓库.
 * @param path          路径.
 * @param fileName      文件名.
 * @param expiredSecond 过期时间(秒).
 * @return
 */
 
public String getDownloadUrl(String repository, String path, String fileName, int expireSeconrd) {
    try {
        return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                .expiry(expireSeconrd)
                .method(Method.GET)
                .bucket(repository)
                .object(path + fileName).build());
    } catch (Exception e) {
        throw new BaseException("GET_DOWNLOAD_URL_ERROR", "获取下载链接错误!", e);
    }
}

minio 复制文件

/**
 * 复制文件.
 *
 * @param repository    目标存储的仓库.
 * @param path          目标路径.
 * @param fileName      目标文件名.
 * @param srcRepository 源存储的仓库.
 * @param srcPath       源路径.
 * @param srcFileName   源文件名.
 * @return 				上传文件的MD5值.
 */
 
public String copy(String repository, String path, String fileName, String srcRepository, String srcPath,
                   String srcFileName) {
    try {
        ObjectWriteResponse writeResponse = minioClient.copyObject(CopyObjectArgs.builder()
                .source(CopySource.builder().bucket(srcRepository).object(srcPath + srcFileName).build())
                .bucket(repository)
                .object(path + fileName).build());
        return writeResponse.etag();
    } catch (Exception e) {
        throw new BaseException("COPY_TO_MINIO_FAILED", "上传至Minio出错!", e);
    }
}

minio 删除文件

public void remove(String repository, String path, String fileName) {
    try {
        minioClient.removeObject(RemoveObjectArgs.builder().bucket(repository).object(path + fileName).build());
    } catch (Exception e) {
        throw new BaseException("REMOVE_FROM_MINIO_FAILED", "删除Minio文件出错!", e);
    }
}

minio 获取 StatObjectResponse

    public StatObjectResponse getObjectStat(String repository, String path, String fileName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        return minioClient.statObject(StatObjectArgs.builder().bucket(repository).object(path + fileName).build()
        );
    }

controller 上传示例

    @ApiOperation(value = "minio", notes = "使用原文件名,相同文件名会覆盖")
    @PostMapping(value = "/minio")
    NjcResponseEntity<String> uploadFile(MultipartFile file) throws Exception {
        storageService.upload(REPOSITORY, "/fat1/", file.getOriginalFilename(), file);
        return super.success("插入成功");
    }

自动生成 /fat1 文件夹,注意:相同文件名会覆盖
在这里插入图片描述

controller 下载示例

 @ApiOperation(value = "minio", notes = "获取文件流")
 @GetMapping(value = "/minio")
 void downloadStream(@RequestParam(value = "name") String name,HttpServletResponse response) throws Exception {
     try {
         InputStream inputStream = storageService.download(REPOSITORY,"/", name);
         StatObjectResponse objectStat = storageService.getObjectStat(REPOSITORY,"/", name);

         response.setContentType(objectStat.contentType());
         response.setCharacterEncoding("UTF-8");
         response.setHeader("Content-Disposition",
                 "attachment;filename=" + URLEncoder.encode(name, "UTF-8"));

         IOUtils.copy(inputStream, response.getOutputStream());
         inputStream.close();
     } catch (BaseException bd) {
         log.error("BaseException:", bd);
         response.sendError(500, bd.getMessage());
     }
 }
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-06-16 21:50:41  更:2022-06-16 21:51:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:48:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码