Minio的简单使用,实现上传下载功能。
简单介绍下这个minio
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
而且关键的是它是开源的,也特别容易上手,上传下载的速度也很快,安全。
docker环境
在Linux下装好docker,这里不多赘述docker的安装过程
安装好了之后:
1.拉取Minio镜像(稳定版):
docker pull minio/minio
2.运行于docker环境
①. docker run -p 9000:9000 minio/minio server /data
②. docker run -p 9000:9000 --name minio-iot -v /mnt/data:/data -v /mnt/config:/root/.minio minio/minio server /data
以上两个为存储路径
① 的方式为临时性的存储位置在docker容器中,容器的创建、启动、停止、删除、暂停,文件的展示等会影响,对于这个概念的理解可以看看这篇文章—>容器(Container)——镜像运行时的实体
② 数据卷 文件存储的位置为/mnt/data的,这个可以自己定。
备注: 运行安装已经下在的minio : 9000:9000 第一个是外部接口,第二个是内部接口, server 安装到 data
3.CTRL+C关闭运行
4.开启
docker start CONTAINER ID/NAMES (容器id或者容器名)
这里我运行: docker start minio
打开 ip:9000/minio
密码默认:minioadmin/minioadmin
这样的界面就算完成。
上传下载实例(Java版)
@RestController
@RequestMapping("/minio")
public class MinioController {
private static String url = "*******";
private static String accessKey = "minioadmin";
private static String secretKey = "minioadmin";
//上传文件到minio服务器
@PostMapping("files")
public String uploadFiles(@RequestParam("fileName") MultipartFile file) {
try{
MinioClient minioClient = new MinioClient(url, accessKey, secretKey);//minio客户端
InputStream is = file.getInputStream();//获取文件流
String filename = file.getOriginalFilename();//获取文件名称
String contentType = file.getContentType();//获取文件类型
minioClient.putObject("files",filename,is,contentType);//添加文件到(minio)存储桶中
return "上传成功!";
}
catch (Exception ex) {
ex.printStackTrace();
return "上传失败!";
}
}
/*
* 下载文件
* presignedGetObject(String bucketName, String objectName, Integer expires)
* 生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,
* 即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。
* */
@GetMapping("download")
public void downloadFiles(@RequestParam("filename") String filename, HttpServletResponse httpResponse) throws InvalidPortException, InvalidEndpointException {
MinioClient minioClient = new MinioClient(url,accessKey,secretKey);
try(InputStream ism = new BufferedInputStream(minioClient.getObject("files",filename))) {
// 调用statObject()来判断对象是否存在。
// 如果不存在, statObject()抛出异常,
// 否则则代表对象存在
minioClient.statObject("files", filename);
byte buf[] = new byte[1024];
int length = 0;
httpResponse.reset();
//Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。
// Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,
// 文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
httpResponse.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
httpResponse.setContentType("application/x-msdownload");
httpResponse.setCharacterEncoding("utf-8");
OutputStream osm = new BufferedOutputStream(httpResponse.getOutputStream());
while ((length = ism.read(buf))>0) {
osm.write(buf,0, length);
}
osm.close();
} catch (MinioException ex) {
ex.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}