java中几种对象存储(文件存储)中间件的介绍

一、前言

在博主得到系统中使用的对象存储主要有OSS(阿里云的对象存储) COS(腾讯云的对象存储)OBS(华为云的对象存储)还有就是MinIO 这些玩意。其实这种东西大差不差,几乎实现方式都是一样,存储模式大同小异。下面介绍几种存储模式在springBoot中的使用。

二、阿里云OSS

阿里云对象存储服务(Object Storage Service,简称OSS)是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。它具有与平台无关的RESTful API接口,能够提供99.999999999%(11个9)的数据可靠性和99.99%的服务可用性。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

基于OSS,用户可以搭建出各种多媒体分享网站、网盘、个人和企业数据备份等基于大规模数据的服务。OSS非常适合用来存储大量不同大小、格式的非结构化数据,比如视频、图像、文本、日志等,且单个文件最大支持48.8TB,不限文件数量和大小。同时,OSS提供多种存储类型,包括标准存储、低频存储和归档存储,用户可以根据需求选择相应的存储类型。

在使用OSS时,用户可以通过阿里云控制台、图形化工具和命令行工具对数据进行上传、下载和管理。此外,OSS还提供了简单的REST接口,使得用户可以在任何互联网设备上进行数据的上传和下载。

关于OSS的定价和计量计费方式,阿里云提供了详细的说明。用户在使用OSS时,需要注意相关的使用限制和错误码,以确保服务的正常使用。

1、引入依赖

		<!--oss --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>${aliyun-sdk-oss.version}</version></dependency>

2、读取配置

@Data
@Component
@ConfigurationProperties(prefix = "oss.aliyun")
public class AliYunProperties {/**域名*/private String domain;/**地域节点*/private String endpoint;/**存储桶名称*/private String bucketName;/**accessKey*/private String accessKey;/**accessSecret*/private String accessSecret;/**图片策略*/private String styleRule;/**缩略图策略*/private String thumbnailStyleRule;/**文件类型*/private List<String> fileTypes;}

3、实现图片上传

@Slf4j
@Component("aliyun")
public class AliYunFileHandle implements FileStrategy {@AutowiredAliYunProperties aliYunProperties;private static OSS ossClient;@Overridepublic UploadDto upload(MultipartFile file) throws Exception {return upload(file, null);}@Overridepublic UploadDto upload(MultipartFile file, String filePath) throws Exception {//文件名String fileFullName = FileUtil.getName(file.getOriginalFilename());InputStream inputStream = file.getInputStream();return upload(inputStream, fileFullName, filePath);}public UploadDto upload(InputStream inputStream, String fileFullName, String filePath) throws Exception {if (inputStream == null) {throw new Exception("上传文件不能为空");}OSS ossClient = getOssClient();try {//时间戳String timestamp = String.valueOf(System.currentTimeMillis());//文件扩展名String extension = FileUtil.getSuffix(fileFullName);String fileName = FileUtil.getPrefix(fileFullName);List<String> fileTypes = aliYunProperties.getFileTypes();if(fileTypes != null) {boolean flag= fileTypes.contains(extension);Assert.isTrue(flag, "不支持上传的文件类型:" + extension);}String upFilePath = StringUtils.join(fileName, "_", timestamp, ".", extension);if(filePath != null) {upFilePath = StringUtils.join(filePath, "/", upFilePath);}//String upFilePath = StringUtils.join(encodeName, ".", extension);// 文件上传PutObjectResult putObjectResult = ossClient.putObject(aliYunProperties.getBucketName(), upFilePath, inputStream);if (putObjectResult == null) {log.error("上传附件到阿里云失败 fileName={}", upFilePath);throw new Exception("上传附件 " + upFilePath + " 到阿里云失败 ");}log.info("oss fileName:" + upFilePath);//返回上传结果UploadDto uploadDto = new UploadDto();uploadDto.setName(upFilePath);
//            uploadDto.setImgUrl(filePath);
//            uploadDto.setKey(upFilePath);uploadDto.setCreateTime(DateUtil.date());//            //缩略图处理
//            if (isImageType(uploadDto.getMediaType())) {
//                BufferedImage image = ImageIO.read(file.getInputStream());
//                uploadDto.setWidth(image.getWidth());
//                uploadDto.setHeight(image.getHeight());
//                uploadDto.setThumbPath(StringUtils.isBlank(aliYunProperties.getThumbnailStyleRule()) ? filePath : filePath + aliYunProperties.getThumbnailStyleRule());
//            }return uploadDto;} catch (Exception e) {log.error("oss 上传失败", e);throw new RuntimeException("文件="+fileFullName + " 上传失败");} finally {ossClient.shutdown();}}private OSS getOssClient() {// 调用了shutdown方法,暂时不使用连接池方式
//        if(ossClient == null) {ossClient = new OSSClientBuilder().build(aliYunProperties.getEndpoint(),aliYunProperties.getAccessKey(),aliYunProperties.getAccessSecret());
//        }return ossClient;}@Overridepublic byte[] download(String key) throws Exception {if (key == null) {throw new Exception("文件key不能为空");}OSS ossClient = getOssClient();try {// 填写不包含Bucket名称在内的Object完整路径,例如testfolder/exampleobject.txtOSSObject ossObject = ossClient.getObject(new GetObjectRequest(aliYunProperties.getBucketName(), key));return IoUtil.readBytes(ossObject.getObjectContent());} catch (Exception e) {e.printStackTrace();} finally {ossClient.shutdown();}return null;}@Overridepublic void delete(String key) {}}

三、腾讯云 COS

腾讯云对象存储(Cloud Object Storage,COS)是一种分布式存储服务,专为存储海量文件而设计。用户可以通过网络随时存储和查看数据,享受高扩展性、低成本、可靠且安全的数据存储服务。

COS通过控制台、API、SDK和工具等多样化方式,简单、快速地接入,实现海量数据存储和管理。用户可以轻松进行任意格式文件的上传、下载和管理,一个存储桶可容纳无数个对象。对象(Object)是COS的基本单元,可以理解为任何格式类型的数据,例如图片、文档和音视频文件等。

根据访问频度的高低,COS提供三种对象的存储级别:标准存储、低频存储和归档存储。标准存储为用户提供了高可靠性、高可用性和高性能的对象存储服务,适用于有大量热点文件,需要频繁访问数据的业务场景,如热点视频、社交图片等。低频存储则适用于不频繁访问数据的存储,如网盘数据、大数据分析等,它同样提供高可靠性,但存储成本和访问时延相对较低。

此外,腾讯云还提供了COSBrowser这一桌面版工具,用户可以使用该工具进行可视化、方便的数据上传、下载等操作。这些功能使得COS成为一个强大且灵活的云存储解决方案,能够满足各种业务类型的存储需求。

1、引入依赖

		<!--cos --><dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>${cos_api.version}</version></dependency>

2、读取配置

@Data
@Component
@ConfigurationProperties(prefix = "oss.tencent")
public class TencentProperties {/**域名*/private String domain;/**地域节点*/private String region;/**存储桶名称*/private String bucketName;/**secretId*/private String secretId;/**secretKey*/private String secretKey;/**图片策略*/private String styleRule;/**缩略图策略*/private String thumbnailStyleRule;/**文件类型*/private List<String> fileTypes;
}

3、文件上传下载

@Slf4j
@Component("tencent")
public class TencentFileHandle implements FileStrategy {@AutowiredTencentProperties tencentProperties;// 创建 COSClient 实例,这个实例用来后续调用请求COSClient createCOSClient() {// 设置用户身份信息。// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理String secretId = tencentProperties.getSecretId();String secretKey = tencentProperties.getSecretKey();COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);// ClientConfig 中包含了后续请求 COS 的客户端设置:ClientConfig clientConfig = new ClientConfig();// 设置 bucket 的地域// COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224clientConfig.setRegion(new Region(tencentProperties.getRegion()));// 设置请求协议, http 或者 https// 5.6.53 及更低的版本,建议设置使用 https 协议// 5.6.54 及更高版本,默认使用了 httpsclientConfig.setHttpProtocol(HttpProtocol.https);// 以下的设置,是可选的:// 设置 socket 读取超时,默认 30sclientConfig.setSocketTimeout(30*1000);// 设置建立连接超时,默认 30sclientConfig.setConnectionTimeout(30*1000);// 如果需要的话,设置 http 代理,ip 以及 port
//        clientConfig.setHttpProxyIp("httpProxyIp");
//        clientConfig.setHttpProxyPort(80);// 生成 cos 客户端。return new COSClient(cred, clientConfig);}// 创建 TransferManager 实例,这个实例用来后续调用高级接口TransferManager createTransferManager() {// 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。// 详细代码参见本页: 简单操作 -> 创建 COSClientCOSClient cosClient = createCOSClient();// 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源// 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。ExecutorService threadPool = Executors.newFixedThreadPool(32);// 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。TransferManager transferManager = new TransferManager(cosClient, threadPool);// 设置高级接口的配置项// 分块上传阈值和分块大小分别为 5MB 和 1MBTransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);transferManager.setConfiguration(transferManagerConfiguration);return transferManager;}void shutdownTransferManager(TransferManager transferManager) {// 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。// 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。transferManager.shutdownNow(true);}@Overridepublic UploadDto upload(MultipartFile file) throws Exception {return upload(file, null);}@Overridepublic UploadDto upload(MultipartFile file, String filePath) throws Exception {//文件名String fileFullName = FileUtil.getName(file.getOriginalFilename());InputStream inputStream = file.getInputStream();return upload(inputStream, fileFullName, filePath);}public UploadDto upload(InputStream inputStream, String fileFullName, String filePath) throws Exception {if (inputStream == null) {throw new Exception("上传文件不能为空");}TransferManager transferManager = createTransferManager();String bucketName = tencentProperties.getBucketName();//int inputStreamLength = 1024 * 1024;
//        byte data[] = new byte[inputStreamLength];
//        InputStream inputStream = new ByteArrayInputStream(data);ObjectMetadata objectMetadata = new ObjectMetadata();// 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length// 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了//objectMetadata.setContentLength(inputStreamLength);try {//时间戳String timestamp = String.valueOf(System.currentTimeMillis());//文件扩展名String extension = FileUtil.getSuffix(fileFullName);String fileName = FileUtil.getPrefix(fileFullName);List<String> fileTypes = tencentProperties.getFileTypes();if(fileTypes != null) {boolean flag= fileTypes.contains(extension);Assert.isTrue(flag, "不支持上传的文件类型:" + extension);}String upFilePath = StringUtils.join(fileName, "_", timestamp, ".", extension);if(filePath != null) {upFilePath = StringUtils.join(filePath, "/", upFilePath);}String key = upFilePath;PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);// 高级接口会返回一个异步结果Upload// 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回UploadResult, 失败抛出异常Upload upload = transferManager.upload(putObjectRequest);UploadResult uploadResult = upload.waitForUploadResult();if (uploadResult == null) {log.error("上传附件到腾讯云失败 fileName={}", upFilePath);throw new Exception("上传附件 " + upFilePath + " 到腾讯云失败 ");}log.info("cos fileName:" + upFilePath);//返回上传结果UploadDto uploadDto = new UploadDto();uploadDto.setName(upFilePath);
//            uploadDto.setKey(upFilePath);uploadDto.setCreateTime(DateUtil.date());return uploadDto;} catch (Exception e) {log.error("cos 上传失败", e);throw new RuntimeException("文件="+fileFullName + " 上传失败");} finally {shutdownTransferManager(transferManager);}}@Overridepublic byte[] download(String key) throws Exception {return null;}@Overridepublic void delete(String key) {}}

四、华为云OBS

华为云OBS,即华为云对象存储服务(Object Storage Service),是华为云提供的一种简单、高效、安全的云存储解决方案。它基于对象存储架构,为用户提供了海量、安全、高可靠、低成本的数据存储能力,且无需考虑容量限制。

华为云OBS具有以下主要特点和功能:

  1. 海量存储与高性能:OBS提供了超大存储容量的能力,适合存放任意类型的文件,并支持高速的数据存取和传输,满足用户对于大规模数据存储和高效访问的需求。
  2. 数据安全性:OBS通过多重安全机制和加密技术,保障用户数据的安全性和隐私性。同时,它还提供数据备份和恢复功能,确保数据的可靠性和完整性。
  3. 灵活配置与管理:OBS提供了灵活的配置选项和丰富的管理工具,用户可以根据实际需求定制存储方案,并通过可视化界面或API接口进行便捷的数据管理操作。
  4. 跨域资源共享:OBS支持CORS(跨域资源共享)规范,使得跨域请求可以在OBS上获取资源,方便用户在不同域之间进行数据共享和交互。
  5. 生命周期管理:OBS支持对对象版本进行生命周期管理,通过预定义的生命周期规则,自动执行数据的转换、迁移或删除等操作,帮助用户更好地管理数据生命周期。

此外,华为云OBS还提供了多种存储类型供用户选择,以满足不同业务场景的需求。同时,它与其他华为云服务和产品无缝集成,为用户提供一站式云计算基础设施服务体验。

1、引入依赖

<dependency><groupId>com.obs</groupId><artifactId>obs</artifactId><version>3.2.5</version>
</dependency>

2、需要的配置

华为云OBS存储桶名称
obs.bucketName=your-bucket-name
#华为云OBS服务节点,如上海(China East)
obs.endpoint=http://your-endpoint
#华为云OBS账户AK
obs.accessKey=your-access-key-id
#华为云OBS账户SK
obs.secretKey=your-secret-access-key

3、代码实现

import com.obs.services.ObsClient;
import com.obs.services.model.PutObjectRequest;
import com.obs.services.model.PutObjectResult;public class OBSExample {public static void main(String[] args) {// 填入你的OBS访问密钥、秘钥和地址String accessKey = "你的Access Key";String secretKey = "你的Secret Key";String endPoint = "你的End Point";String bucketName = "你的Bucket Name";String objectKey = "你要上传的Object Key";String filePath = "文件路径";try {// 创建ObsClient实例ObsClient obsClient = new ObsClient(accessKey, secretKey, endPoint);// 创建上传请求PutObjectRequest request = new PutObjectRequest();request.setBucketName(bucketName); // 设置Bucket名称request.setObjectKey(objectKey); // 设置Object名称request.setFilePath(filePath); // 设置文件路径// 上传文件PutObjectResult result = obsClient.putObject(request);System.out.println("Upload file successfully, ETag:" + result.getETag());// 关闭ObsClient实例obsClient.close();} catch (Exception e) {e.printStackTrace();}}
}

五、MinIo

Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。基于Apache License v2.0开源协议的对象存储项目,采用Golang实现,客户端支Java,Python,Javacript, Golang语言。

其设计的主要目标是作为私有云对象存储的标准方案。主要用于存储海量的图片,视频,文档等。非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

实现也差不多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/529046.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】CSS2:样式、选择器、伪类、颜色、字体、边框、列表、背景、盒子、布局、浮动

本文介绍了CSS样式、选择器、伪类、像素、颜色、字体、边框、列表、表格属性、背景、盒子、布局与浮动 1.样式 1.1 行内样式 <h1 style"color: aqua;font-size: large;">123</h1> 1.2 内部样式 <style>h1{color: red;font: 100;}</style>…

从16-bit 到 1.58-bit :大模型内存效率和准确性之间的最佳权衡

通过量化可以减少大型语言模型的大小&#xff0c;但是量化是不准确的&#xff0c;因为它在过程中丢失了信息。通常较大的llm可以在精度损失很小的情况下量化到较低的精度&#xff0c;而较小的llm则很难精确量化。 什么时候使用一个小的LLM比量化一个大的LLM更好? 在本文中&a…

关于比特币的AI对话

【ChatGPT】 比特币源码开源吗&#xff1f; 是的&#xff0c;比特币的源码是开源的。比特币项目是在MIT许可证下发布的&#xff0c;这意味着任何人都可以查看、修改、贡献和分发代码。比特币的源码托管在GitHub上&#xff0c;可以通过下面的链接进行访问&#xff1a; https://g…

13.【蓝桥杯】-ing 移除链表元素 简单题

一、题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&…

【深度学习笔记】优化算法——学习率调度器

学习率调度器 &#x1f3f7;sec_scheduler 到目前为止&#xff0c;我们主要关注如何更新权重向量的优化算法&#xff0c;而不是它们的更新速率。 然而&#xff0c;调整学习率通常与实际算法同样重要&#xff0c;有如下几方面需要考虑&#xff1a; 首先&#xff0c;学习率的大…

2024-03-10 c++

&#x1f338; MFC下拉框控件 | Combo Box eg 计算器 1。新建MFC项目&#xff08;基于对话框、静态库&#xff09; 2。添加控件&#xff0c;删除初始的3个多余控件 加3个edit control 加1个combo box&#xff0c;属性sort改为false&#xff0c;data为 ;-;;;% 加1个static text…

不同路径 不同路径 II 整数拆分

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。…

SpringBoot中MD5使用

SpringBoot中MD5使用 新建md5类 public final class MD5 {public static String encrypt(String strSrc) {try {char[] hexChars {0, 1, 2, 3, 4, 5, 6, 7, 8,9, a, b, c, d, e, f};byte[] bytes strSrc.getBytes();MessageDigest md MessageDigest.getInstance("MD5…

linux设置systemctl启动

linux设置nginx systemctl启动 生成nginx.pid文件 #验证nginx的配置&#xff0c;并生成nginx.pid文件 /usr/local/nginx/sbin/nginx -t #pid文件目录在 /usr/local/nginx/run/nginx.pid 设置systemctl启动nginx #添加之前需要先关闭启动状态的nginx&#xff0c;让nginx是未…

一文了解原型和原型链

本文重点概念&#xff1a; 1、所有的对象都是new一个函数创建的 2、所有的函数都有一个属性prototype&#xff0c;称为函数原型 3、函数原型得到的这个对象都有一个属性constructor,指向该函数 4、所有的对象都有一个属性&#xff1a;隐式原型__proto__&#xff0c;隐式原型…

【APP逆向】酒仙网预约茅台程序,包含逆向过程详解

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:爬虫实战,零基础、进阶教学 景天的主页:景天科技苑 文章目录 酒仙网预约抢购茅台1.抓包分析,账户名和密码登录2.短信登录3.登录+茅台预约 密码登录酒仙网预约抢购茅台 目标:账号登…

【JetsonNano】onnxruntime-gpu 环境编译和安装,支持 Python 和 C++ 开发

1. 设备 2. 环境 sudo apt-get install protobuf-compiler libprotoc-devexport PATH/usr/local/cuda/bin:${PATH} export CUDA_PATH/usr/local/cuda export cuDNN_PATH/usr/lib/aarch64-linux-gnu export CMAKE_ARGS"-DONNX_CUSTOM_PROTOC_EXECUTABLE/usr/bin/protoc&qu…