背景

在互联网发展的今天,近乎所有的云厂商都提供对象存储服务。一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

当我们在使用对应云厂商产品的时候,只需要引入对应尝试提供的 SDK ,根据其开发文档实现即可。但是当我们接入的云厂商较多(或者能够保证接口水平迁移时),我们要根据目标厂商接口破坏性修改

如下提供了几家厂商接口 SDK 上传实例:

阿里云

// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>"; // 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 创建PutObjectRequest对象。
String content = "Hello OSS";
PutObjectRequest putObjectRequest = new PutObjectRequest("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content.getBytes())); // 上传字符串。
ossClient.putObject(putObjectRequest); // 关闭OSSClient。
ossClient.shutdown();

华为云

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint); obsClient.putObject("bucketname", "objectname", new File("localfile")); // localfile为待上传的本地文件路径,需要指定到具体的文件名

七牛云

Configuration cfg = new Configuration(Region.region0());
UploadManager uploadManager = new UploadManager(cfg);
String accessKey = "your access key";
String secretKey = "your secret key";
String localFilePath = "/home/qiniu/test.png";
String key = null; Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
Response response = uploadManager.put(localFilePath, key, upToken);

解决方案

Amazon S3 协议

Amazon 是最早提供对象存储服务 的厂商,制定文件存储相关的业内标准,这意味着只需要实现 S3 协议即可接入兼容此协议的文件存储厂商和中间件。当然 S3 协议不仅仅是技术实现要求标准,对于可用性等都有具体的要求。

兼容 S3 协议国内云厂商

名称 地址
阿里云 https://www.aliyun.com
华为云 https://www.huaweicloud.com
腾讯云 https://cloud.tencent.com
七牛云 https://www.qiniu.com
金山云 https://www.ksyun.com

如何使用

  • 引入依赖。 引入此依赖,无需在引入云厂商 SDK
<dependency>
<groupId>com.pig4cloud.plugin</groupId>
<artifactId>oss-spring-boot-starter</artifactId>
<version>0.0.1</version>
</dependency>
  • 配置文件存储
oss:
path-style-access: false #请求路径是否 XXX/{bucketName}
endpoint: s3-cn-east-1.qiniucs.com
access-key: xxx # 云厂商提供的key
secret-key: xxx # 云厂商提供的密钥
bucketName: pig4cloud # 上文创建的桶名称
  • 操作

@Autowire
private final OssTemplate ossTemplate; ossTemplate.putObject(CommonConstants.BUCKET_NAME, fileName, file.getInputStream());

支持 MINIO 等自建文件存储

  • 创建 minio
docker run -p 9000:9000 --name minio1 \
-e "MINIO_ACCESS_KEY=lengleng" \
-e "MINIO_SECRET_KEY=lengleng" \
minio/minio server /data
  • 配置 minio 参数
# 文件系统
oss:
path-style-access: true
endpoint: http://IP:9000
access-key: lengleng
secret-key: lengleng
bucketName: lengleng
  • 使用 OssTemplate 上传即可

源码地址:

https://github.com/pig-mesh/oss-spring-boot-starter 欢迎 fork 扩展

项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

「一站式」兼容所有云厂商文件存储Spring Boot 实现的更多相关文章

  1. 基于properties文件的Spring Boot多环境切换

    当我们使用properties文件作为Spring Boot的配置文件而不是yaml文件时,怎样实现多环境使用不同的配置信息呢?     在Spring Boot中,多环境配置的文件名需要满足appl ...

  2. 在Mac中使用「dd」指令烧录ISO镜像文件到U盘

    作者:超級efly   發布:2014-07-26 20:22   分類:電腦   閱讀:442   11條評論    大家在Windows系統下可以方便的使用UltraISO程式來燒錄「.ISO」, ...

  3. spring boot:用itextpdf处理pdf表格文件(spring boot 2.3.2)

    一,什么是itextpdf? 1,itextpdf的用途 itextpdf是用来生成PDF文档的一个java类库, 通过iText可以生成PDF文档, 还可以把XML/Html文件转化为PDF文件 2 ...

  4. Android内存管理(12)*「实例」用Monitor 生成.hprof文件 并分析内存泄漏

    参考 http://blog.csdn.net/xiaanming/article/details/42396507 基本步骤: 1,准备一个有内存泄漏的代码 2,如何发现内存泄漏 3,生成.hpro ...

  5. 「thunar」给thunar增加搜索文件功能

    1.安装catfish sudo apt-get install catfish 2.配置thunar,添加[自定义动作] 打开 Thunar 后,点击 Edit -> Configure cu ...

  6. mybatis 热部署xml文件(spring boot和springmvc两种方式)

    参考:http://thinkgem.iteye.com/blog/2304557 步骤:1.创建两个java类 (1)MapperRefresh.java   :用于刷新mapper (2)SqlS ...

  7. 「MoreThanJava」计算机系统概述

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  8. Spring Boot 2.x基础教程:实现文件上传

    文件上传的功能实现是我们做Web应用时候最为常见的应用场景,比如:实现头像的上传,Excel文件数据的导入等功能,都需要我们先实现文件的上传,然后再做图片的裁剪,excel数据的解析入库等后续操作. ...

  9. Spring Boot 2.x基础教程:多个文件的上传

    昨天,我们介绍了如何在Spring Boot中实现文件的上传.有读者问:那么如果有多个文件要同时上传呢?这就马上奉上,当碰到多个文件要同时上传的处理方法. 动手试试 本文的动手环节将基于Spring ...

随机推荐

  1. PyQt5 点不着的按钮

    1 import sys 2 import typing 3 4 from PyQt5 import QtWidgets, QtGui, QtCore 5 import random 6 7 clas ...

  2. 06.numpy聚合运算

    >>> import numpy as np >>> L = np.random.random(100) >>> L array([0.82846 ...

  3. AI数学基础之:奇异值和奇异值分解

    目录 简介 相似矩阵 对角矩阵 可对角化矩阵 特征值 特征分解 特征值的几何意义 奇异值 Singular value 奇异值分解SVD 简介 奇异值是矩阵中的一个非常重要的概念,一般是通过奇异值分解 ...

  4. Spark + GraphX + Pregel

    Spark+GraphX图 Q:什么是图?图的应用场景 A:图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种网状数据结构,表示为二元组:Gragh=(V,E),V\E分别是顶点 ...

  5. short i=1;i=i+1;为什么报错?

    先测试,看结果: 提示我们说不能将short类型的转化为int类型! 先不急着下结论,我们继续测试,用i+=1; 我们发现并没有报错,为什么同样是加1,会出现这样两种不同的结果呢? 查阅了一些资料,大 ...

  6. 谈一下HashMap的底层原理是什么?

    底层原理:Map + 无序 + 键唯一 + 哈希表 (数组+Entry)+ 存取值 1.HashMap是Map接口的实现类.实现HashMap对数据的操作,允许有一个null键,多个null值. Co ...

  7. Django 报错 Reverse for 'content' not found. 'content' is not a valid view function or pattern name.

    Django 报错 Reverse for 'content' not found. 'content' is not a valid view function or pattern name. 我 ...

  8. MySQL注入 前端int型参数插入SQL语句

    类似PHP语言的 mysql_real_escape_string() 的函数,在用来防范SQL注入的时候,可能会遇到int型注入成功的情况. mysql_real_escape_string()用法 ...

  9. Prometheus时序数据库-数据的插入

    Prometheus时序数据库-数据的插入 前言 在之前的文章里,笔者详细的阐述了Prometheus时序数据库在内存和磁盘中的存储结构.有了前面的铺垫,笔者就可以在本篇文章阐述下数据的插入过程. 监 ...

  10. drf给上传图片重命名

    1.先在你项目中添加一个文件夹如:system 在文件夹下添加__init__.py 和storage.py文件,并在storage.py中添加如下代码: #复制代码 -- coding: UTF-8 ...