一、阿里云 OSS
1、什么是阿里云 OSS?
OSS 为 Object Storage Service,即对象存储服务。是阿里云提供的海量、安全、低成本、高可靠的云存储服务。
OSS 具有与平台无关的 RESTful API 接口,可以在任意应用、任意时间、任意地点 存储与访问 任何类型的数据。
简单地理解:OSS 基于网络提供数据存储服务,通过网络可以随时存储、获取 文本、图片、音频、视频等 非结构化数据。
比如网站的 图片、视频等文件就可以存放在 OSS 中(海量数据,自己维护起来麻烦,交给其他人去维护),每次从 OSS 中获取即可。
【官方文档:】 https://help.aliyun.com/document_detail/31817.html
2、基本概念认识
简单介绍几个概念,混个眼熟(详情可参考官方文档)。
(1)存储类型(Storage Class)
存储类型分为:标准、低频访问、归档。价格依次下降。
标准存储:高可靠、高可用、高性能,用于保存频繁访问的数据。
低频访问存储:用于保存不常被访问的数据。
归档存储:用于保存需要长期保存的数据。
(2)存储空间(Bucket)
用于存储对象(Object)的容器,不同的存储空间可以存储不同的数据。
存储空间可以定义 地域、访问权限、存储类型等操作。
(3)对象/文件(Object)
对象是 OSS 存储的基本单位,由元信息(Object Meta)、数据(Data)、文件名(key)组成。
其中:
key 用来标识对象。
Object Meta 用来保存对象的属性,比如最后修改时间、大小等。
Data 就是需要保存的数据了,比如图片、视频等。
(4)地域(Region)
表示 OSS 存储的物理位置,需要选择合适的地域创建 OSS。
(5)访问域名(EndPoint)
表示 OSS 对外服务的访问域名,通过域名去存储、获取对象。
(6)访问密钥(AccessKey)
用于身份验证。常用 AccessKeyId 和 AccessKeySecret 验证身份。
AccessKeyId 用于标识某个用户。
AccessKeySecret 用户的密钥。
二、阿里云 OSS 基本使用?
1、快速使用?
(1)如何使用?
Step1:开通 OSS 服务。
Step2:创建一个 存储空间(bucket)。
Step3:上传文件。
Step4:下载文件。
Step5:删除文件。
Step6;删除存储空间。
(2)如何管理?
可以使用命令行管理工具管理(ossutil)。
可以使用图形界面工具管理(ossbrowser)。
可以使用 API 、SDK 管理。(比如 Java SDK)。
【API 与 SDK 区别:】
API:Application Programming Interface,即应用程序接口。
SDK:Software Development Kit,即软件开发工具包。
简单的理解:
API 用于访问一个函数。
SDK 是第三方提供的工具包,里面有各种函数,即各种 API。
2、开通 OSS 服务
(1)Step1:去官网开通(先注册一个阿里云账号,再去开通 对象存储 OSS 服务)。
【官网地址:】 https://www.aliyun.com/
(2)Step2:勾选协议,并点击开通。
(3)Step3:开通成功,跳转到控制台。
3、创建一个 存储空间(bucket)
(1)Step1:在控制台界面创建一个存储空间。
(2)Step2:填写 存储空间相关信息。
4、上传文件
(1)Step1:进入文件管理页面。
(2)Step2:可以新建目录、上传文件。
(3)Step3:上传文件。
5、下载文件
(1)Step1:打开文件详情页,或直接打开更多菜单栏直接下载。
(2)Step2:直接下载,或者复制 URL下载。
6、删除文件、删除存储空间
(1)删除文件。
(2)删除存储空间。
三、使用 Java SDK 操作 OSS(重点)
1、首先需要创建 Accesskey
(1)为什么使用AccessKey ?
AccessKey 就相当于一个账号和密码,但其使用场景不同,其等同于一个子账号。
比如:
你需要一个账号用来登陆 阿里云,此时的用户名、密码可用于访问 OSS,但是如果你在程序中使用这个账号去管理 OSS,那么容易造成你的账号泄露,不安全。
AccessKey 就相当于一个子账号,其专门用来访问 OSS或者其他服务,不能用于登陆阿里云,这样就可以避免阿里云账号泄露。
(2)创建 Accesskey
Step1:进入控制台
Step2:点击头像,选择 Accesskey 管理。
Step3:选择子用户 Accesskey
Step4:进入 RAM 访问控制后,选择用户,创建用户。
Step5:填写相关信息,需要验证手机号。
Step6:修改权限。
2、使用 Java SDK 访问 OSS(比如上传文件)
【参考文档操作:】 https://help.aliyun.com/document_detail/32008.html?spm=a2c4g.11186623.6.767.6fafc06dbZUvg7
(1)创建一个 SpringBoot 项目,采用 maven 方式引入 SDK。
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.8.0</version> </dependency>
(2)使用文件流方式上传图片。
此处未与前端代码结合,直接使用本地指定文件的方式进行测试。
import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; @SpringBootTest class TestOssApplicationTests { @Test void testUpdateOss() { // Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。 String accessKeyId = "LTAI4GFaU9tbzYLLDBY2Nyvr"; String accessKeySecret = "ynSYOKMnRFWd79u9t6VDNJrbrXNtgQ"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 上传文件流。 InputStream inputStream = null; try { inputStream = new FileInputStream("E:\myProject\test\images\2.jpg"); } catch (FileNotFoundException e) { e.printStackTrace(); } ossClient.putObject("test-oss-2020-4-29", "2020-4-29-test-2.jpg", inputStream); // 关闭OSSClient。 ossClient.shutdown(); } }
3、Web 端上传数据到 OSS 的方式
【参考文档地址:】 https://help.aliyun.com/document_detail/112718.html?spm=a2c4g.11186623.6.1523.572c6e28rWmm2T
(1)普通方式上传文件
前端将数据 传输到 后台服务器,再由服务器向 OSS 中传输。
中间经过了 我们自己的 后台服务器 进行中转,增大了后端服务器的压力、且上传速度慢。
(2)服务端签名后直传文件
前端可以直接传输文件到 OSS。
前端向服务器请求一个签名,服务器返回签名,前端直接传输数据到 OSS(通过签名校验)。
4、如何操作服务端签名后直传?
【官方文档地址:】 https://help.aliyun.com/document_detail/91868.html?spm=a2c4g.11186623.2.15.21e26e28JVnnHT#concept-ahk-rfz-2fb
(1)Step1:
提供一个 Controller,用于响应 前端发来的签名请求。
注意:
若出现跨域问题,可以在业务方法前,添加上 @CrossOrigin 注解。
package com.lyh.template.springboot_template.controller; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.utils.BinaryUtil; import com.aliyun.oss.model.MatchMode; import com.aliyun.oss.model.PolicyConditions; import com.lyh.template.springboot_template.common.util.Result; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.sql.Date; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.LinkedHashMap; import java.util.Map; @RestController public class PolicyController{ @CrossOrigin @RequestMapping("/oss/policy") public Result policy() { String accessId = "LTAI4GFaU9tbzYLLDBY2Nyvr"; // 请填写您的AccessKeyId。 String accessKey = "ynSYOKMnRFWd79u9t6VDNJrbrXNtgQ"; // 请填写您的AccessKeySecret。 String endpoint = "oss-cn-hangzhou.aliyuncs.com"; // 请填写您的 endpoint。 String bucket = "test-oss-2020-4-29"; // 请填写您的 bucketname 。 String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。 // String callbackUrl = "http://88.88.88.88:8888"; String dir = DateTimeFormatter.ofPattern("yyyy年MM月dd日").format(LocalDateTime.now()) + "/"; // 用户上传文件时指定的前缀。 // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey); Map<String, String> respMap = new LinkedHashMap<String, String>(); 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.put("accessid", accessId); respMap.put("policy", encodedPolicy); respMap.put("signature", postSignature); respMap.put("dir", dir); respMap.put("host", host); respMap.put("expire", String.valueOf(expireEndTime / 1000)); } catch (Exception e) { System.out.println(e.getMessage()); } return Result.ok().data("items", respMap); } }
(2)Step2:
使用 文档上 提供的前端测试代码,修改并测试。
【代码地址:】 http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/86983/APP_zh/1537971352825/aliyun-oss-appserver-js-master.zip?spm=a2c4g.11186623.2.15.22ae4c07OsJgbj&file=aliyun-oss-appserver-js-master.zip
修改代码 (upload.js)。
测试(index.html)
(3)OSS 修改 CORS,解决跨域问题。
(4)再次测试