spu的保存功能中的图片上传
(1)MinIo介绍
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
官方文档:http://docs.minio.org.cn/docs 旧一点
应用场景
1.单主机单硬盘模式
2.单主机多硬盘模式
3.多主机多硬盘分布式
特点
· 高性能:作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GB/s的写速率
· 可扩容:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心
· 云原生:容器化、基于K8S的编排、多租户支持
· Amazon S3兼容:Minio使用Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK和AWS CLI访问Minio服务器。
· 可对接后端存储: 除了Minio自己的文件系统,还支持DAS、 JBODs、NAS、Google云存储和Azure Blob存储。
· SDK支持: 基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持
· Lambda计算: Minio服务器通过其兼容AWS SNS / SQS的事件通知服务触发Lambda功能。支持的目标是消息队列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等数据库。
· 有操作页面
· 功能简单: 这一设计原则让MinIO不容易出错、更快启动
· 支持纠删码:MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据!
存储机制
Minio使用纠删码erasure code和校验和checksum。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。
纠删码是一种恢复丢失和损坏数据的数学算法。
(2)docker访问
前面已经进行了安装:
docker pull minio/minio
新版本:
docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-d --restart=always \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=admin123456" \
-v /home/data:/data \
-v /home/config:/root/.minio \
minio/minio server /data --console-address ":9001"
浏览器访问:http://IP:9001/minio/login,如图:
说明:安装是指定了登录账号
minio都是往桶里面存数据
注意访问:服务器ip:端口/桶名/文件名(或者点击copy连接访问)
(3)利用Java客户端调用Minio
在service-product模块中添加依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.0</version>
</dependency>
添加配置文件
在nacos 中配置好了!
minio:
endpointUrl: http://192.168.254.165:9000
accessKey: admin
secreKey: admin123456
bucketName: gmall
创建FileUploadController控制器
package com.atguigu.gmall.product.controller;
@RestController
@RequestMapping("admin/product")
public class FileUploadController {
// 获取文件上传对应的地址
@Value("${minio.endpointUrl}")
public String endpointUrl;
@Value("${minio.accessKey}")
public String accessKey;
@Value("${minio.secreKey}")
public String secreKey;
@Value("${minio.bucketName}")
public String bucketName;
// 文件上传控制器
@PostMapping("fileUpload")
public Result fileUpload(MultipartFile file) throws Exception{
// 准备获取到上传的文件路径!
String url = "";
// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象 :创建客户端对象
// MinioClient minioClient = new MinioClient("https://play.min.io", "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
MinioClient minioClient =
MinioClient.builder()
.endpoint(endpointUrl)
.credentials(accessKey, secreKey)
.build();
// 检查存储桶是否已经存在
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if(isExist) {
System.out.println("Bucket already exists.");
} else {
// 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());
}
// 定义一个文件的名称 : 文件上传的时候,名称不能重复!
String fileName = System.currentTimeMillis()+ UUID.randomUUID().toString();
// 使用putObject上传一个文件到存储桶中。
// minioClient.putObject("asiatrip","asiaphotos.zip", "/home/user/Photos/asiaphotos.zip");
minioClient.putObject(
PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build());
// System.out.println("/home/user/Photos/asiaphotos.zip is successfully uploaded as asiaphotos.zip to `asiatrip` bucket.");
// 文件上传之后的路径: http://39.99.159.121:9000/gmall/xxxxxx
url = endpointUrl+"/"+bucketName+"/"+fileName;
System.out.println("url:\t"+url);
// 将文件上传之后的路径返回给页面!
return Result.ok(url);
}
}
保证时间一致
注意:文件上传时,需要调整一下linux 服务器的时间与windows 时间一致!第一步:安装ntp服务yum -y install ntp第二步:开启开机启动服务systemctl enable ntpd第三步:启动服务systemctl start ntpd第四步:更改时区timedatectl set-timezone Asia/Shanghai第五步:启用ntp同步timedatectl set-ntp yes第六步:同步时间ntpq -p
前端上传组件:
标签:文件,存储,Minio,尚品,bucketName,上传,minio From: https://blog.csdn.net/dengfengling999/article/details/140110707