文件存储解决方案-云存储阿里 OSS

1.文件存储(上传)解决方案讨论

1.图解

  • 文件存储解决方案-云存储阿里 OSS

解读上图

  1. 普通上传并不是分布式,也不是集群,可用性不高
  2. 普通上传的分布式情况,使用了集群,但是当把文件存储在集群中的某台服务器,当下次读取时,因为负载均衡,存在读取不到的文件问题
  3. 应用服务器使用集群,文件存储通过网关提供统一接口来存储文件,可用性高
    3.1 方案 1: 自建服务器,成本高, 也存在技术瓶颈
    3.2 方案 2: 使用云存储产品(阿里云等), 是企业优选方案

2.对应 分布式 微服务 架构分析

2.阿里云对象存储介绍

1.官网

https://www.aliyun.com/product/oss

2.说明

阿里云对象存储 OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供数据高可用性, 多种存储类型供选择,全面优化存储成本

3.上传方式

1.普通上传方式

1.阿里云对象存储-普通上传示意图

2.分析

  • 上传慢:用户数据需先上传到应用服务器,之后再上传到OSS。网络传输时间比直传到OSS多一倍。如果用户数据不通过应用服务器中转,而是直传到OSS,速度将大大提升。

  • 扩展性差:如果后续用户多了,应用服务器会成为瓶颈。

  • 费用高:需要准备多台应用服务器。由于OSS上传流量是免费的,如果数据直传到OSS,
    不通过应用服务器,那么将能省下几台应用服务器

2.服务端签名后直传

1.阿里云对象存储-服务端签名后直传示意图

2.分析

  • Web端向服务端请求签名,然后直接上传,不会对服务端产生压力,而且安全可靠。
  • 但服务端无法实时了解用户上传了多少文件,上传了什么文件。如果想实时了解用户
    上传了什么文件,可以采用服务端签名直传并设置上传回调

3.准备工作

1.注册一个阿里云账号,并完成认证

2.阿里云地址:https://www.aliyun.com/

3.创建阿里云对象 Bucket 创建并测试

4.创建 RAM 用户(访问控制 RAM(Resource Access Management)是阿里云提供的一项管理用户身份与资源访问权限的服务), 得到 accessKeyId 和 accessKeySecret (可以理解成是阿里云子用户的 id 和密码)

具体步骤可以参考:https://llinp.cn/articles/2022/01/02/1641105914205.html

5.将得到 endpoint , accessKeyId , accessKeySecret 填写到代码中, 并指定要上传的文
件路径, 阿里云哪个 Bucket 和上传后的文件名是什么

4.使用原生 SDK,上传文件到阿里云对象 Bucket

参考阿里云官方文档 https://help.aliyun.com/document_detail/84781.html#p-yqj-z1w-rl2

,这里我使用的是简单上传-上传文件流的方式。

1.创建一个boot项目引入依赖

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.5.0</version>
</dependency>

2.编写如下一个测试类,进行测试。

@RestController
public class TestController {@RequestMapping("/test")public R test() {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。String accessKeyId = "你的accessKeyId";String accessKeySecret = "你的accessKeySecret";// 填写Bucket名称,例如examplebucket。String bucketName = "你的bucketName";// 上传文件名 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "12.jpg";// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。String filePath = "C:\\Users\\llp\\Desktop\\solo-fetchupload-7208404724819002506-m0Dvrtu.jpg";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {//文件输入流InputStream inputStream = new FileInputStream(filePath);// 创建PutObject请求。 将文件流写入到objectName文件中ossClient.putObject(bucketName, objectName, inputStream);} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (ossClient != null) {ossClient.shutdown();}}return R.ok();}}

可以看到文件已经上传到阿里云oss服务器上了

5.使用 SpringCloud Alibaba OSS 传文件到阿里云对象 Bucket

1.引入依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId><version>2.1.0.RELEASE</version>
</dependency>

2.编写yaml

spring:datasource:username: rootpassword: rooturl: jdbc:mysql://192.168.56.100:3306/llpliving_commodity?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.jdbc.Drivercloud:alicloud:oss:endpoint: 参考创建bucket时选择的归属区域access-key: 你的keyIdsecret-key: 你的keySecretbucket-name: 你的bucketName

3.编写测试类

    @Resourceprivate OSSClient ossClient;@Value("${spring.cloud.alicloud.bucket-name}")private String bucketName;//上传指定的文件到bucket@RequestMapping("/test2")public R test2() throws FileNotFoundException {String filePath = "C:\\Users\\asus\\Desktop\\solo-fetchupload-7208404724819002506-m0Dvrtu.jpg";String objectName = "13.jpg";InputStream inputStream = new FileInputStream(filePath);ossClient.putObject(bucketName, objectName, inputStream);ossClient.shutdown();return R.ok();}

6.完成服务端签名后直传

1.文档

https://help.aliyun.com/document_detail/31926.html

2.代码示例

https://help.aliyun.com/document_detail/91868.htm

3.代码+配置实现

1.引入依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId><version>2.1.0.RELEASE</version>
</dependency>

2.编写yaml

server:port: 7070spring:cloud:alicloud:oss:endpoint: oss-cn-chengdu.hangzhou.comaccess-key: 你的accessKeysecret-key: 你的secretKeybucket-name: 你的bucketName

3.配置类,从yaml配置文件中读取配置信息

@Data
@Component
@ConfigurationProperties("spring.cloud.alicloud")
public class OssProperties implements InitializingBean {@Value("${spring.cloud.alicloud.oss.endpoint}")private String endpoint;private String accessKey;private String secretKey;private String bucketName;public static String ENDPOINT;public static String KEY_ID;public static String KEY_SECRET;public static String BUCKET_NAME;@Overridepublic void afterPropertiesSet() throws Exception {this.ENDPOINT = endpoint;this.KEY_ID = accessKey;this.KEY_SECRET = secretKey;this.BUCKET_NAME = bucketName;this.ENDPOINT = endpoint;}}

4.编写测试类

@RestController
public class OssServiceController {//提示:这里的注入方式是 OSS 接口注入, 不要写成实现类了@Resourceprivate OSS ossClient;/*** 获取文件上传签名/授权* 这段代码从阿里云示例文档拷贝, 并做修改,去掉暂时不用的代码** @return*/@RequestMapping("/oss/policy")public R policy() {// 填写Host地址,格式为https://bucketname.endpoint。String host = "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT;// 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。// 我们可以将文件按照 年-月-日的形式分目录存放在阿里云String format = new SimpleDateFormat("yyyy/MM/dd").format(new Date());// 用户上传文件时指定的前缀。String dir = format + "/";// 创建ossClient实例。OSS ossClient = new OSSClientBuilder().build(OssProperties.ENDPOINT, OssProperties.KEY_ID, OssProperties.KEY_SECRET);Map<String, String> respMap = null;try {long expireTime = 30;long expireEndTime = System.currentTimeMillis() + expireTime * 1000;Date expiration = new Date(expireEndTime);PolicyConditions policyConds = new PolicyConditions();policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);byte[] binaryData = postPolicy.getBytes("utf-8");String encodedPolicy = BinaryUtil.toBase64String(binaryData);String postSignature = ossClient.calculatePostSignature(postPolicy);respMap = new LinkedHashMap<String, String>();respMap.put("accessId", OssProperties.KEY_ID);respMap.put("policy", encodedPolicy);respMap.put("signature", postSignature);respMap.put("dir", dir);respMap.put("host", host);respMap.put("expire", String.valueOf(expireEndTime / 1000));// respMap.put("expire", formatISO8601Date(expiration));} catch (Exception e) {// Assert.fail(e.getMessage());System.out.println(e.getMessage());}return R.ok().put("data", respMap);}
}

5.测试

浏览器: http://localhost:7070/oss/policy

6.前端拿到policy凭证之后,通过policy直接上传到阿里云

import http from '@/utils/httpRequest.js'
export function policy() {return  new Promise((resolve,reject)=>{http({//url: http.adornUrl("/oss/policy"),url: "http://localhost:7070/oss/policy",method: "get",params: http.adornParams({})}).then(({ data }) => {resolve(data);})});
}

7.前端拿到policy直接进行上传会存在跨域问题

8.解决阿里云跨域问题, 设置跨域

数据安全-跨域设置

9.再次上传,依然存在问题

10.再次上传,上传成功

文件存储解决方案-云存储阿里 OSS相关推荐

  1. 网络硬盘录像机、边缘存储和云存储的优缺点

    网络摄像机的出现改变了存储解决方案在安防行业的面貌.由于监控系统转向基于网络的系统,记录和存储的选择不再明确.如今的存储方案包括网络硬盘录像机NVR.边缘存储和云存储解决方案.通过首先区分每种方案的优 ...

  2. 收费最低的云存储_云存储、网盘怎么区分,有何不同?

    云存储这个概念这些年一直很火,也会有人问"云存储还是网盘,这两种和存储有什么区别?"今天小编来给大家简单介绍一下. 什么是网盘? 网盘,也可以称为网络硬盘,是由互联网公司推出的在线 ...

  3. Springboot 整合常用对象存储工具(asw s3 亚马逊云存储,minio,阿里oss)

    1.引入依赖(gradle) // asw s3 亚马逊云存储implementation 'com.amazonaws:aws-java-sdk-s3:1.11.830'// minio clien ...

  4. SpringBoot 文件管理微服务 支持FastDFS/FTP/阿里云存储、华为云存储/天翼云存储/联通云存储移动云存储

    本微服务实现了对文件上传.下载进行管理,分别支持FastDFS存储.FTP存储.天翼云存储.华为云存储(OBS).阿里云存储(OSS).移动云.可通过配置自动切换存储类型.本微服务支持临时文件24小时 ...

  5. linux nfs文件挂载模拟云存储

    背景 产品上线前兼容性测试,云存储未到位: 系统:SUSE Linux Enterprise Server 11 SP1 解决方法 其中一个服务器A开放nfs服务,模拟云存储,其它服务器挂载A的目录, ...

  6. 本地存储与云存储方案价值对比—Vecloud

    越来越多的人认为,对于许多公司而言,云具有商业意义.实际上,据<福布斯>估计,到今年年底,全球83%的企业将以某种方式使用云技术. 但这并不一定意味着将基础架构大规模迁移到云将最适合您的业 ...

  7. 腾讯云对象存储 python_python 云存储

    广告关闭 云服务器1核2G首年99年,还有多款热门云产品满足您的上云需求 存储桶 bucketxml python sdk 存储桶名称由两部分组成:用户自定义字符串 和 appid,两者以中划线&qu ...

  8. C# 通过S3上传文件到私有云存储

    //引用的包为Amazon.S3//添加的引用为://using Amazon.S3;//using Amazon.S3.Model;public static void UploadFiles(){ ...

  9. android 个人云存储,个人云存储app-个人云安卓版-地之图下载

    小编今天为大家推荐的是一款个人云网盘app,在现在各大云服务上线的时代,各种网盘让人看得眼花缭乱,而每个用户都需要一款保密性好的个人云网盘,这款个人云网盘不光储存量大,保密性更是一流的,需要的小伙伴下 ...

最新文章

  1. 美国任命首位首席信息安全官
  2. 不允许所请求的注册表访问权
  3. wireshark无权限
  4. nginx反向代理和rewrite进行解决跨域问题、去掉url中的一部分字符串,通过nginx正则生成新的url
  5. jQuery Sizzle选择器(一)
  6. 【selenium】 selenium web测试工具介绍(一)
  7. mt4 指标 涨跌幅 颜色k线_通达信指标公式源码阴线买股+黄金K线指标+源码
  8. 执行器接线图_风机盘管组装全过程,盘管与接管接线图,拿走不谢!
  9. 空间正交基的定义_正交向量与子空间
  10. 最详细的equals和hashcode详解
  11. 基于深度学习的数字识别GUI的设计
  12. 华为网络拒绝接入_网络拒绝接入什么意思
  13. python之路_mysql数据操作1
  14. 机器人油封_机器人油封 机器人减速机 机器人伺服电机油封 KVNOK油封
  15. Openwrt中安装njit-client(njit8021xclient)及使用方法
  16. Java中的Ant与Maven比较整理
  17. 联想交换机服务器型号,ThinkSystem DB610s光纤交换机
  18. RGB转HDMI模块解决方案
  19. 小米蓝牙广播数据解析(MiBeacon)
  20. CCNA、CCNP、H3C认证精品视频课程

热门文章

  1. PCB设计中过孔的概念和分类
  2. Android左右声道音频文件测试
  3. 「第三章」跨站脚本攻击(XSS)
  4. MFC之学习Bezier样条使用
  5. 逃离同质化,OPPO折叠屏正在笃定远一点的未来
  6. 软件工程师必读的10本书,你读了吗?
  7. 戴尔服务器r730系统,戴尔dell poweredge r730服务器系统安装配置详解教程
  8. 数据处理(一):数据质量分析
  9. 计算机毕业设计之基于微信小程序的优惠券领取系统
  10. 阿里云云计算acp认证考试是什么?阿里云认证体系