minio操作工具类(其中,ip,端口,账号,密码在配置文件中配置)

@Api(value = "minio操作")
@Component
public class UploadFileToMinio implements InitializingBean {@Value("${minio.endpoint}")private String endpoint;//minio ip@Value("${minio.port}")private int port;//minio 端口@Value("${minio.accessKey}")private String accessKey;//minio 账号@Value("${minio.secretKey}")private String secretKey;//minio 密码@Value("${minio.secure}")private boolean secure;//如果是true,则用的是https而不是http,默认值是truepublic MinioClient minioClient;private static final int DEFAULT_EXPIRY_TIME = 7 * 24 * 3600;@Overridepublic void afterPropertiesSet() throws Exception {minioClient = new MinioClient(endpoint, port, accessKey, secretKey,secure);}/*** 检查存储桶是否存在** @param bucketName 存储桶名称* @return*/@SneakyThrowspublic boolean bucketExists(String bucketName) {boolean flag = false;flag = minioClient.bucketExists(bucketName);if (flag) {return true;}return false;}/*** 创建存储桶** @param bucketName 存储桶名称*/@SneakyThrowspublic boolean makeBucket(String bucketName) {boolean flag = bucketExists(bucketName);if (!flag) {minioClient.makeBucket(bucketName);return true;} else {return false;}}/*** 列出所有存储桶名称** @return*/@SneakyThrowspublic List<String> listBucketNames() {List<Bucket> bucketList = listBuckets();List<String> bucketListName = new ArrayList<>();for (Bucket bucket : bucketList) {bucketListName.add(bucket.name());}return bucketListName;}/*** 列出所有存储桶** @return*/@SneakyThrowspublic List<Bucket> listBuckets() {return minioClient.listBuckets();}/*** 删除存储桶** @param bucketName 存储桶名称* @return*/@SneakyThrowspublic boolean removeBucket(String bucketName) {boolean flag = bucketExists(bucketName);if (flag) {Iterable<Result<Item>> myObjects = listObjects(bucketName);for (Result<Item> result : myObjects) {Item item = result.get();// 有对象文件,则删除失败if (item.size() > 0) {return false;}}// 删除存储桶,注意,只有存储桶为空时才能删除成功。minioClient.removeBucket(bucketName);flag = bucketExists(bucketName);if (!flag) {return true;}}return false;}/*** 列出存储桶中的所有对象名称** @param bucketName 存储桶名称* @return*/@SneakyThrowspublic List<String> listObjectNames(String bucketName) {List<String> listObjectNames = new ArrayList<>();boolean flag = bucketExists(bucketName);if (flag) {Iterable<Result<Item>> myObjects = listObjects(bucketName);for (Result<Item> result : myObjects) {Item item = result.get();listObjectNames.add(item.objectName());}}return listObjectNames;}/*** 列出存储桶中的所有对象** @param bucketName 存储桶名称* @return*/@SneakyThrowspublic Iterable<Result<Item>> listObjects(String bucketName) {boolean flag = bucketExists(bucketName);if (flag) {return minioClient.listObjects(bucketName);}return null;}/*** 通过文件上传到对象** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @param fileName   File name* @return*/@SneakyThrowspublic boolean putObject(String bucketName, String objectName, String fileName) {boolean flag = bucketExists(bucketName);if (flag) {minioClient.putObject(bucketName, objectName, fileName, null);ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {return true;}}return false;}/*** 文件上传** @param bucketName* @param multipartFile*/@SneakyThrowspublic void putObject(String bucketName, MultipartFile multipartFile, String filename) {PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);putObjectOptions.setContentType(multipartFile.getContentType());minioClient.putObject(bucketName, filename, multipartFile.getInputStream(), putObjectOptions);}/*** 通过InputStream上传对象** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @param stream     要上传的流* @return*/@SneakyThrowspublic boolean putObject(String bucketName, String objectName, InputStream stream) {boolean flag = bucketExists(bucketName);if (flag) {minioClient.putObject(bucketName, objectName, stream, new PutObjectOptions(stream.available(), -1));ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {return true;}}return false;}/*** 以流的形式获取一个文件对象** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @return*/@SneakyThrowspublic InputStream getObject(String bucketName, String objectName) {boolean flag = bucketExists(bucketName);if (flag) {ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {InputStream stream = minioClient.getObject(bucketName, objectName);return stream;}}return null;}/*** 以流的形式获取一个文件对象(断点下载)** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @param offset     起始字节的位置* @param length     要读取的长度 (可选,如果无值则代表读到文件结尾)* @return*/@SneakyThrowspublic InputStream getObject(String bucketName, String objectName, long offset, Long length) {boolean flag = bucketExists(bucketName);if (flag) {ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {InputStream stream = minioClient.getObject(bucketName, objectName, offset, length);return stream;}}return null;}/*** 下载并将文件保存到本地** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @param fileName   File name* @return*/@SneakyThrowspublic boolean getObject(String bucketName, String objectName, String fileName) {boolean flag = bucketExists(bucketName);if (flag) {ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {minioClient.getObject(bucketName, objectName, fileName);return true;}}return false;}/*** 删除一个对象** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称*/@SneakyThrowspublic boolean removeObject(String bucketName, String objectName) {boolean flag = bucketExists(bucketName);if (flag) {minioClient.removeObject(bucketName, objectName);return true;}return false;}/*** 删除指定桶的多个文件对象,返回删除错误的对象列表,全部删除成功,返回空列表** @param bucketName  存储桶名称* @param objectNames 含有要删除的多个object名称的迭代器对象* @return*/@SneakyThrowspublic List<String> removeObject(String bucketName, List<String> objectNames) {List<String> deleteErrorNames = new ArrayList<>();boolean flag = bucketExists(bucketName);if (flag) {Iterable<Result<DeleteError>> results = minioClient.removeObjects(bucketName, objectNames);for (Result<DeleteError> result : results) {DeleteError error = result.get();deleteErrorNames.add(error.objectName());}}return deleteErrorNames;}/*** 生成一个给HTTP GET请求用的presigned URL。* 浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @param expires    失效时间(以秒为单位),默认是7天,不得大于七天* @return*/@SneakyThrowspublic String presignedGetObject(String bucketName, String objectName, Integer expires) {boolean flag = bucketExists(bucketName);String url = "";if (flag) {if (expires < 1 || expires > DEFAULT_EXPIRY_TIME) {throw new InvalidExpiresRangeException(expires,"expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME);}url = minioClient.presignedGetObject(bucketName, objectName, expires);}return url;}/*** 生成一个给HTTP PUT请求用的presigned URL。* 浏览器/移动端的客户端可以用这个URL进行上传,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @param expires    失效时间(以秒为单位),默认是7天,不得大于七天* @return*/@SneakyThrowspublic String presignedPutObject(String bucketName, String objectName, Integer expires) {boolean flag = bucketExists(bucketName);String url = "";if (flag) {if (expires < 1 || expires > DEFAULT_EXPIRY_TIME) {throw new InvalidExpiresRangeException(expires,"expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME);}url = minioClient.presignedPutObject(bucketName, objectName, expires);}return url;}/*** 获取对象的元数据** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @return*/@SneakyThrowspublic ObjectStat statObject(String bucketName, String objectName) {boolean flag = bucketExists(bucketName);if (flag) {ObjectStat statObject = minioClient.statObject(bucketName, objectName);return statObject;}return null;}/*** 文件访问路径** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @return*/@SneakyThrowspublic String getObjectUrl(String bucketName, String objectName) {boolean flag = bucketExists(bucketName);String url = "";if (flag) {url = minioClient.getObjectUrl(bucketName, objectName);}return url;}public void downloadFile(String bucketName, String fileName, String originalName, HttpServletResponse response) {try {InputStream file = minioClient.getObject(bucketName, fileName);String filename = new String(fileName.getBytes("ISO8859-1"), StandardCharsets.UTF_8);if (StringUtils.isNotEmpty(originalName)) {fileName = originalName;}response.setHeader("Content-Disposition", "attachment;filename=" + filename);ServletOutputStream servletOutputStream = response.getOutputStream();int len;byte[] buffer = new byte[1024];while ((len = file.read(buffer)) > 0) {servletOutputStream.write(buffer, 0, len);}servletOutputStream.flush();file.close();servletOutputStream.close();} catch (ErrorResponseException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}}

借助工具类实现minio中文件的上传下载,其中上传很简单直接调上面的方法就好了,但是下载有问题的,要求是在浏览器下载,也就是后端传流给前端,由前端下载但是问题是minio中文件存的格式不固定,什么exe,text啥的都有,这就导致前端设置的文件类型如果和minio中的文件类型不一致,下载的文件就会打不开损坏,

我的思路是将下载下来的文件存到本地再打成压缩包发给前端,前端设置格式为.zip的压缩文件,这样不管存的啥文件下载下来都是压缩包,解压后就能得到源文件了,代码如下

其中xxxx是我们项目中的实体类,换成你的实体就好了,要可以根据这个实体获取到minio的桶名,文件名等信息

@PostMapping("/downloadFile")public ResultEntity downloadFile(HttpServletResponse response ,@RequestBody XXXX xxxx) {response.setContentType("application/zip");try {InputStream object = uploadFileToMinio.getObject(xxxx.getBucketName(), xxxx.getFileName());//根据当前类 获取项目路径String realAppPath = DataBackServiceImpl.class.getResource("/").toString();int index = realAppPath.indexOf("target");Properties prop = System.getProperties();String os = prop.getProperty("os.name");int var = 1;if (os.startsWith("Win") || os.startsWith("win"))var = 0;realAppPath = realAppPath.substring(6 - var, index - 1); // ***/appsec// 创建临时存储文件目录File file1 = new File(realAppPath + "/minio-Temp");if (!file1.exists()) {file1.mkdir();}// 创建压缩文件String zipSavePath = realAppPath + "/minio-Temp/test.zip";ZipFile zipFile = new ZipFile(zipSavePath);//创建临时存储文件//获取文件后缀String fileName = xxxx.getFileName();String[] split = fileName.split("\\.");String s = split[split.length - 1];File file = new File(realAppPath + "/minio-Temp/firmware." + s);if (!file.exists()) {file.createNewFile();}//保存文件的方法this.saveFile(object,realAppPath,s);//设置压缩参数ZipParameters parameters = new ZipParameters();parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);zipFile.addFile(new File(realAppPath+ "/minio-Temp/firmware."+s),parameters);File zipFile1 = new File(zipSavePath);InputStream input = new FileInputStream(zipFile1);OutputStream outputStream1 = response.getOutputStream();byte[] buf = new byte[1024*10];int bytesRead;while ((bytesRead = input.read(buf)) > 0) {outputStream1.write(buf, 0, bytesRead);}input.close();object.close();outputStream1.close();
//       删除临时文件this.deleteDir(file1);} catch (IOException e) {e.printStackTrace();}catch (ZipException e) {e.printStackTrace();}return null;}

minio操作,文件上传下载相关推荐

  1. 【Java编程系列】Minio实现文件上传下载

    热门系列: [Java编程系列]Amazon S3实现文件上传下载 目录 热门系列: 1.前言 2.Minio实战代码 2.1 Minio环境部署 2.2 Minio的Sdk对接实现 2.2.1 Mi ...

  2. minio实现文件上传下载和删除功能

    前言 之前用到文件上传功能,在这里做个学习记录.使用minio实现,后面会记录使用fastdfs和阿里云的oss实现文件上传以及他们的比较(oss根据流量收费).minio的中文文档:https:// ...

  3. Apache FTPClient操作文件上传下载及公共类

    我们在项目中可能需要使用ftp进行文件的上传.下载.获取服务器目录信息等相关操作,我们可以使用apache的FTPClient进行相关的操作,下面把相关公共方法与大家交流分享,每个方法前都有详细的注释 ...

  4. java文件客户端下载_使用Java写一个minio的客户端上传下载文件

    标签:color   ati   tty   java   system   wired   format   media   param 前言: 确保已经安装了minio的服务端 代码: pom.x ...

  5. IO 操作 (二进制流文件上传下载)

    后台 二进制流 -> 前台blob对象 ->生成 dateUrl->前台 file->dataUrl -blob ->FormData ->后台 java 后台返回 ...

  6. java jsch下载文件,JSch使用sftp协议实现服务器文件上传下载操作

    Jsch是什么? JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等.你可以将它的功能集成到你自己的 程序中.同时该项目也提供一个J2 ...

  7. 教你如何实现c#文件上传下载功能

    简单介绍一下c#文件上传下载功能实现. NuGet 安装SqlSugar Model文件下新建 DbContext 类 public class DbContext {public DbContext ...

  8. [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  9. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

最新文章

  1. Write-Ahead Transaction Log
  2. 产品设计体会(1001)初探用户需求
  3. 顺序表的应用——逆置问题
  4. php array in array,浅谈PHP array_search 和 in_array 函数效率问题
  5. Java实现快速排序 Quick Sort
  6. Linux服务器配置PHP文件下载,出现中文乱码问题,下载出错
  7. 前端知识区别和学习路线_个人收藏
  8. gl3520 gl3510_带有gl gl本机的跨平台地理空间可视化
  9. 【发现问题】Java中PrintWriter和BufferedWriter的区别
  10. n元n次方程求解c 语言,解n元一次方程
  11. 业务、架构、技术,我们应该关注什么
  12. 总结MySQL建表、查询优化实用小技巧
  13. zabbix自定义SNMP监控项
  14. 《Pyhton语言程序设计》_第7章_对象和类
  15. XMindCrack.jar下载
  16. 数字图像处理 冈萨雷斯(第四版)图像配准
  17. 虚拟机桥接模式下设置桥接的网卡
  18. 类和对象10:对象访问方法
  19. 使用高德地图实现根据地名查询经纬度
  20. 标准化考场时钟系统方案

热门文章

  1. Ogre 天龙八部 GridInfo文件格式说明(正确版)
  2. 测试内容总结-测试分类
  3. 读懂英文文章所需的单词量
  4. 硬件相关优化代码host_kernel_mod的个人理解
  5. 微信小程序实现新闻轮播、禁止手动竖向滑动
  6. 共享电商即共享商圈的背后: 共创、共生、共享、共富,共赢的共富精神
  7. 【无人机】模拟一群配备向下摄像头的移动空中代理覆盖平面区域(Matlab代码实现)
  8. java 解析 manifest_详解Manifest
  9. 「凤凰网专访」极视角何庆:点亮繁星 赋能百业
  10. 详细讲解从用户空间申请内存到内核如何为其分配内存的过程