此处先将图片下载到本地,再进行转换

MinIO是一个对象存储服务,非常轻量

Java Api

依赖:

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

java api 通过一个http客户端进行存储和获取对象文件,所以java代码中可以通过以下的步骤进行存储和获取:

//1 实例化一个MinioClient客户端:
MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
//2 创建存储桶bucket:
String bucket = "demo-bucket";
boolean isExist = minioClient.bucketExists(bucket);if(isExist) {LOGGER.info("Bucket {} already exists.", bucket);} else {minioClient.makeBucket(bucket);}
//3 存储文件对象(需要指定存储的桶):
minioClient.putObject(bucket, destFileName, file.getAbsolutePath());
//因为MinioClient使用http客户端,并不是长连接,所以不需要进行关闭连接和释放资源的操作。
//至此,文件已经存储完毕,可以在Minio服务器查询看到,bucket中的文件
//4 获取对象文件如下(获取输入流InputStream):
public InputStream getStream(String bucket, String fileName) {InputStream is = null;
try {MinioClient minioClient = ...; // 再实例化一个客户端is = minioClient.getObject(bucket, fileName);
} catch(MinioException | NoSuchAlgorithmException | IOException | XmlPullParserException | InvalidKeyException e) {LOGGER.error("error: {}", e.getMessage());
}
return is;
}//如果需要获取File对象:
public File getFile(String bucket, String fileName) {InputStream is = getStream(bucket, fileName);File dir = new File(tmpDir);if (!dir.exists() || dir.isFile()) {dir.mkdirs();}File file = new File(tmpDir + fileName);try {FileUtils.copyToFile(is, file);} catch (IOException e) {e.printStackTrace();}return file;
}
//如果需要下载文件,可以直接将输入流写入servlet输出流即可:
public void writeTo(String bucket, String fileName, OutputStream os) throws IOException {InputStream is = getStream(bucket, fileName);byte[] bytes = new byte[1024];int len;while ((len = is.read(bytes)) != -1) {os.write(bytes, 0, len);}os.flush();
}

项目使用小例

Controller

@Autowiredprivate ProjectImageAppService projectImageAppService;@ResponseBody@GetMapping(value = "/downloadProjectPhoto/{fileName}")@ApiOperation(value = "下载项目图片返回base64")public Result downloadProjectPhoto( @ApiParam(value = "下载项目图片", required = true) @PathVariable String fileName) {String base64Image = projectImageAppService.downloadProjectPhoto(fileName);if(StringUtils.isEmpty(base64Image)){return Result.failure();}else {Map<String, Object> map = new HashMap<>();map.put("imageBase64", base64Image);return Result.success(map);}}@ResponseBody@PostMapping(value = "/createPhoto")@ApiOperation(value = "添加报警数据图片报警")public Result create(@ApiParam(value = "图片报警", required = true) @RequestParam(value = "base64")String base64,@RequestParam(value = "base64Array")String[] base64Array,@RequestParam(value = "uid")String uid) {EmsAlert emsAlert = safetyMonitoringService.create(base64, base64Array, uid);if (emsAlert == null) {return Result.failure();}return Result.success();}@ResponseBody@GetMapping(value = "/downloadPhoto/{fileName}")@ApiOperation(value = "下载数据图片[可共用]")public void download(HttpServletResponse response, HttpServletRequest request, @ApiParam(value = "下载图片报警", required = true) @PathVariable String fileName) {safetyMonitoringService.download(response, fileName);}

service

 /*** 下载项目图片* @param fileName 项目图片名称* @return 项目数据*/public String downloadProjectPhoto(@NotNull String fileName) {try {return minIoService.downloadPhotoBase64(fileName);}catch (Exception e){}return null;}/*** 添加报警数据* @param base64 报警图片大图* @param base64Array 报警图小图* @param uid 识别码* @return 报警数据*/public EmsAlert create(@NotNull String base64,String[] base64Array,String uid) {String resourcePid = null;try {//上传if (multipartFileUtils.base64ToMultipart(base64) != null){String upload = minIoService.upload(multipartFileUtils.base64ToMultipart(base64));if (upload.equals("") || upload.equals(null)){return null;}}}catch (Exception e){e.printStackTrace();return null;}}/*** 下载报警图片* @param fileName 报警图片名称* @return 报警数据*/public void download(HttpServletResponse response, @NotNull String fileName) {try {minIoService.download(fileName,response);}catch (Exception e){}}

MinIoService

package com.sjasoft.cloud.admin.service.ems;import com.sjasoft.framework.spring.bean.Result;
import com.sjasoft.framework.spring.utils.minio.MinioUtils;
import io.minio.StatObjectResponse;
import org.apache.poi.util.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Base64;
import java.util.UUID;/*** MinIoService* @version 1.0*/
@Service
public class MinIoService {@Autowiredprivate SafetyMonitoringService safetyMonitoringService;@Value("${photo.path}")private  String localhostPath;/*** 下载文件*/public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) throws IOException {StatObjectResponse stat = MinioUtils.getObjectInfo(fileName);InputStream in = MinioUtils.getObject(fileName);ByteArrayOutputStream swapStream = new ByteArrayOutputStream();byte[] buff = new byte[100];int rc = 0;while ((rc = in.read(buff, 0, 100)) > 0) {swapStream.write(buff, 0, rc);}byte[] b = swapStream.toByteArray();if (b == null) {return;}System.out.println("获取流" + b);OutputStream out = response.getOutputStream();out.write(b);out.flush();out.close();}/*** 上传文件* @param file* @return* @throws Exception Exception*/public String upload(@RequestParam("file") MultipartFile file) throws Exception {if (file.isEmpty()) {return null;} else {// 得到文件流final InputStream is = file.getInputStream();// 文件名final String fileName = UUID.randomUUID().toString() +file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."),file.getOriginalFilename().length());// 把文件放到minio的boots桶里面MinioUtils.putObject(fileName, is);String objectUrl = MinioUtils.getBaseUrl() + fileName;// 关闭输入流is.close();return fileName;}}/*** 删除文件* @param fileName* @return JsonResult*/public Result delete(@RequestParam("fileName") String fileName) throws Exception {MinioUtils.removeObject(fileName);return Result.success("删除成功");}/*** 下载图片以base64方式返回*/public String downloadPhotoBase64(@RequestParam("fileName") String fileName) throws IOException {StatObjectResponse stat = MinioUtils.getObjectInfo(fileName);InputStream in = MinioUtils.getObject(fileName);//转换为base64byte[] bytes = IOUtils.toByteArray(in);String encoded = Base64.getEncoder().encodeToString(bytes);return encoded;}}

application.yml文件

server:port: 9180
spring:application:name: cloud-admindatasource:url: jdbc:mysql://192.168.2.50:3306/ems?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=trueusername: sjadbapassword: dbadmindruid:#连接池初始化大小initial-size: 5#最小空闲连接数min-idle: 10#最大连接数max-active: 20web-stat-filter:exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" #不统计这些请求数据#访问监控网页的登录用户名和密码stat-view-servlet:login-username: druidlogin-password: druid
jwt:#JWT存储的请求头authHeader: Authorization#JWT负载中的认证模式authSchema: Bearer#JWT加解密使用的密钥secret: cloud-admin-secret#JWT的超期限时间(60*60*24=86400)expiration: 86400
eureka:client:service-url:defaultZone: http://localhost:9101/eureka/
mybatis:mapper-locations:- classpath:com/**/dao/*.xml- classpath*:com/**/mapper/*.xml
mapper:mappers: com.sjasoft.framework.spring.mybatis.dao.BaseDaonot-empty: falseidentity: select replace(uuid(), ''-'', '''')before: true
secure:ignored:#安全路径白名单urls:- /swagger-ui.html- /swagger-resources/**- /swagger/**- /**/v2/api-docs- /**/*.js- /**/*.css- /**/*.png- /**/*.ico- /webjars/springfox-swagger-ui/**- /actuator/**- /druid/**- /user/login- /user/register- /user/info- /user/logout- /doc.html- /websocket- /ems/safetyMonitoring/downloadPhotomina:port: 9011
## minio文件系统
minio:endpoint: http://192.168.2.50:9000 #MinIO服务所在地址bucketName: test #存储桶名称accessKey: sja-soft #访问的keysecretKey: sja.1234 #访问的秘钥photo:path: D:/photoPath#这两个密钥在极光官网申请获得
jpush:appKey: 5b31439dbd41e33ee9115fd8masterSecret: 422fa52342fa7cab6e518c80liveTime: 1000
# 组织表中图片前缀
orgImage:imagePrefix: E://360Downloads/testImage/# 亚洲时区
time:zone: Asia/Shanghai# 服务器的时序数据库
InfluxDBConnection:url: http://192.168.2.50:8086username: csemspassword: qaz123/*-+# 数据库名dataBaseName: eam-buildingsite

Minio(储桶bucket)上传和下载文件【Java】(图片转流、base64)相关推荐

  1. 使用php和Amazon S3 sdk上传及下载文件

    使用php和Amazon S3 sdk上传及下载文件,下载Excel文件时总是报文件损坏的错误,解决方案如下 上传 require 'vendor/autoload.php';use Aws\S3\S ...

  2. Python实现向s3共享存储上传和下载文件

    Python实现向s3共享存储上传和下载文件 https://www.cnblogs.com/liang545621/p/10298617.html 使用Python从S3上传和下载文件 https: ...

  3. windows主机用scp命令向Linux服务器上传和下载文件

    windows主机用scp命令向Linux服务器上传和下载文件 文章目录: 一.scp介绍 二.scp上传和下载 1.上传 2.下载 三.scp的更多参数 一.scp介绍 scp是secure cop ...

  4. 利用SecureCRT上传、下载文件(使用sz与rz命令)

    利用SecureCRT上传.下载文件(使用sz与rz命令) 借助securtCRT,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. 其中,对于s ...

  5. 从服务器上传和下载文件方法

    1. ssh 安装SSH Secure Shell Client客户端 下载链接 http://download.csdn.net/detail/jiandanjinxin/9755684 使用方法参 ...

  6. Linux--用SecureCRT来上传和下载文件

    转载自  Linux--用SecureCRT来上传和下载文件 SecureCRT下的文件传输协议有以下几种:ASCII.Xmodem.Ymodem.Zmodem ASCII:这是最快的传输协议,但只能 ...

  7. java http 下载文件_JAVA通过HttpURLConnection 上传和下载文件的方法

    本文介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,分享给大家,具体如下: HttpURLConnection文件上传 HttpURLConnection采用模拟浏览器上传 ...

  8. linux securefx 传输文件失败,解惑:如何使用SecureCRT上传和下载文件、SecureFX乱码问题...

    解惑:如何使用SecureCRT上传和下载文件.SecureFX乱码问题 一.前言 很多时候在windows平台上访问Linux系统的比较好用的工具之一就是SecureCRT了,下面介绍一下这个软件的 ...

  9. Linux下rz/sz安装及使用方法_上传和下载文件

    2019独角兽企业重金招聘Python工程师标准>>> Linux下rz/sz安装及使用方法_上传和下载文件 转载于:https://my.oschina.net/276172622 ...

最新文章

  1. How to never give up
  2. 自古帝王多短命,假如皇帝也懂负载均衡算法...
  3. LINUX 第五章 apache php mysql
  4. 小伙伴们惊呆了!10行 JavaScript 实现文本编辑器
  5. java导出富文本到word_富文本编辑器内容实现word导出下载,请各位大神们指点,感激不尽...
  6. zlib 加密 java_JAVA自带Zlib+base64位压缩加密和解压解密
  7. Webpack使用教程五(Babel)
  8. apk提取加密素材_WDF资源加密及解密工具 – 素材防偷专用工具(附带教程)
  9. 计算机图形学核心期刊,CCF 推荐国际国内会议及中文核心期刊要目总览
  10. 微软苏州校招笔试题目(1月10日)Colorful Lecture Note的解法
  11. 《美丽心灵》兼谈纳什均衡理论
  12. Dynamics 365 配置IFD的向导界面下一步按钮禁用的解决办法
  13. 你一定要知道长痘痘的注意点!!!
  14. AT指令(中文详解版)
  15. hyperledger fabric交易流程
  16. 介绍国产的PHP MVC框架:FleaPHP
  17. 【Dubbo】入门搭建
  18. DBLP 搜索爬虫项目
  19. Linux应用开发3 字符串处理,字符串与其他数字类型的转换,向应用程序传参
  20. 【持续更新中】C#常见问题及其解决(VS2019)

热门文章

  1. BJFU_数据结构习题_262基于哈夫曼树的数据压缩算法
  2. 水桶平分 java_三水桶等分8升水(javascript实现)
  3. linux系统telnet断开时间,telnet 问题
  4. (六十四)c#Winform自定义控件-温度计(工业)
  5. protobuf使用系列详解二
  6. Delphi TColor和16进制颜色 html的相互转换
  7. Ubuntu20.04系统离线安装ssh-server
  8. 火山小视频怎么伪原创 视频md5很慢
  9. Tableau创建自定义调色板
  10. 文件颜色及字符所代表的含义