云对象oss存储简介
阿里云对象存储服务(Object Storage Service 简称OSS) 是阿里云提供的海量 安全 低成本 高可靠的云存储服务。
阿里云OSS云存储简介
什么是阿里云oss云存储 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于 99.9999999999%(12 个 9),服务设计可用性(或业务连续性)不低于 99.995%。
可以使用阿里云提供的 API、SDK 接口或者 OSS 迁移工具轻松地将海量数据移入或移出阿里云 OSS。数据存储到阿里云 OSS 以后,可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)和归档存储(Archive)作为不经常访问数据的存储方式。
OSS 具有与平台无关的 RESTful API 接口,可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
OSS与自建存储对比的优势

应用场景
图片和音视频等应用的海量存储

网页或者移动应用的静态和动态资源分离

云端数据处理

计量计费
阿里云对象存储 OSS 服务费用的各项组成部分及计费方式分为按量计费和包年包月两种。
按量付费:按实际使用量*单价的方式计费,每小时统计前一小时的实际用量并从账户余额中扣除实际消费金额。例如当前时间是 9:30,结算的是 8:00-9:00 产生的费用 。 包年包月:预先购买指定资源包,之后使用资源时,扣除相应的额度。一般情况下,包年包月比按量付费更加优惠。资源包目前仅提供标准(LRS)存储包、低频(LRS)存储包、归档(LRS)存储包、标准ZRS)存储包、低频(ZRS)存储包、下行流量包、 回源流量包、传输加速包,可购买地域请参见购买对象存储 OSS 资源包。
OSS云存储基本概念
存储空间(Bucket)
存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
同一个存储空间的内部是扁平的,没有文件系统目录的概念,所有的对象都直接隶属于其对应的存储空间。
每个用户可以拥有多个存储空间。
存储空间的名称在 OSS 范围内必须是全局唯一的,一旦创建之后无法修改名称。
存储空间内部的对象数目没有限制。
存储空间的命名规范如下:
- 只能包括小写字母、数字和短横线(-)。
- 必须以小写字母或者数字开头和结尾。
- 长度必须在 3–63 字节之间。
Region(地域)
Region 表示 OSS 的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的 Region 访问速度更快。
Region 是在创建 Bucket 的时候指定的,一旦指定之后就不允许更改。该 Bucket 下所有的 Object 都存储在对应的数据中心,目前不支持 Object 级别的 Region 设置。
Endpoint(访问域名)
Endpoint 表示 OSS 对外服务的访问域名。OSS 以 HTTP RESTful API 的形式对外提供服务,当访问不同的 Region 的时候,需要不同的域名。通过内网和外网访问同一个 Region 所需要的 Endpoint 也是不同的。例如杭州 Region 的外网 Endpoint 是 oss-cn-hangzhou.aliyuncs.com,内网 Endpoint 是 osscn-hangzhou-internal.aliyuncs.com。 AccessKey(访问密钥)
AccessKey(简称 AK)指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。OSS 通过使用 AccessKeyId 和 AccessKeySecret 对称加密的方法来验证某个请求的发送者身份。AccessKeyId 用于标识用户;
AccessKeySecret 是用户用于加密签名字符串和 OSS 用来验证签名字符串的密钥,必须保密。对于 OSS 来说,AccessKey 的来源有:
云对象存储接入准备
选择对象存储OSS,进行一个开通即可,一般是一个项目创建一个存贮空间

创建OSS存贮

文件管理,上传文件

上传文件

上传成功

设置跨域请求


创建跨域请求

使用JAVA代码实现OSS存贮
帮助文档:https://help.aliyun.com/document_detail/32007.html
导入依赖,注:JDK9 maven依赖不一样
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>

上传文件有好多种方式,这里选择文件流上传,如果想使用其他方式可以参考帮助文档

测试类
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
// oss-cn-shenzhen.aliyuncs.com 可以在OSS控制台概览查看自己的 外网访问 域名
String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,也就是存贮空间的名称
String bucketName = "yuanceshiyuan";
// 上传的文件名称,自定义
String objectName = "5.jpg";
// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
String filePath= "D:\\__MACOSX\\高清大图\\5.jpg";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
InputStream inputStream = new FileInputStream(filePath);
// 创建PutObject请求。
ossClient.putObject(bucketName, objectName, inputStream);
} catch (OSSException oe) {
throw new Exception("OSS文件上传异常"+oe);
} catch (ClientException ce) {
throw new Exception("Client文件上传异常"+ce);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
可以使用封装好的OSS对象存储
https://github.com/alibaba/spring-cloud-alibaba
导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
</dependency>
在 application.properties 中配置 accessKeyId、secretAccessKey 和 region
// application.properties
alibaba.cloud.access-key=your-ak #对应accessId
alibaba.cloud.secret-key=your-sk #对应accessKey
alibaba.cloud.oss.endpoint=*** #对应endpoint上传地址
alibaba.cloud.oss.bucket=yuanceshiyuan #贮空间的名称
或者yaml配置
alibaba:
cloud:
access-key: access-key
secret-key: secret-key
oss:
endpoint: oss-cn-shenzhen.aliyuncs.com
bucket: yuanceshiyuan
OssController
@RestController
public class OssController {
@Autowired
private OSS ossClient;
@Value("alibaba.cloud.oss.endpoint")
private String endpoint;
@Value("alibaba.cloud.oss.bucket")
private String bucket;//贮空间的名称
@Value("alibaba.cloud.access-key")
private String accessId;
/**
* 文件上传
* @return
*/
@RequestMapping("/oss/policy")
public Map<String,String> policy(){
String host = "https://"+bucket+"."+endpoint; //host格式为bucket+endpoint
String format=new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dir = format+"/";//设置上传的文件夹
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", 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 respMap;
}
}
vue+pringBoot实现OSS存贮
后台
FileController
package com.alyunoss.controller;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
@RestController
public class FileController {
@CrossOrigin
@RequestMapping("/oss/policy")
public Map<String,String> policy(){
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessId = "yourAccessKeyId";
String accessKey = "yourAccessKeySecret";
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "oss-cn-shenzhen.aliyuncs.com";
// 填写Bucket名称,也就是存贮空间的名称
String bucket = "yuanceshiyuan";
// 填写Host地址,格式为https://bucketname.endpoint。
String host = "https://"+bucket+"."+endpoint; //host格式为bucket+endpoint
// 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。
String dir = "cecshi/";//设置上传的文件夹
OSSClient client = new OSSClient(endpoint, accessId, accessKey);
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 = client.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = client.calculatePostSignature(postPolicy);
Map<String, String> respMap = new LinkedHashMap<String, String>();
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));
// respMap.put("expire", formatISO8601Date(expiration));
return respMap;
} catch (Exception e) {
System.out.println(e.getMessage());
}
return null;
}
}
或者application.yaml
alibaba:
cloud:
access-key: LTAI5tPCwcCkjfUFiDp4gTWa
secret-key: XMqT1Ttx8fEItKuvoTfOFQD2oeV2sT
oss:
endpoint: oss-cn-shenzhen.aliyuncs.com
bucket: yuanceshiyuan
@RestController
public class OssController {
@Value("alibaba.cloud.oss.endpoint")
private String endpoint;
@Value("alibaba.cloud.oss.bucket")
private String bucket;//贮空间的名称
@Value("alibaba.cloud.access-key")
private String accessId;
@Value("alibaba.cloud.secret-key")
public String accessKeySecret;
/**
* 文件上传
* @return
*/
@RequestMapping("/oss/policy")
public Map<String,String> policy(){
String host = "https://"+bucket+"."+endpoint; //host格式为bucket+endpoint
String format=new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dir = format+"/";//设置上传的文件夹
Map<String, String> respMap=null;
OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKeySecret);
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", 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 respMap;
}
}
ossUpload.vue
<template>
<div style="width: 400px;margin: 0 auto">
<el-upload
class="upload-demo"
:action="ObjData.host"
:data="ObjData"
:before-upload="beforeUpload"
:file-list="fileList"
list-type="picture">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
</div>
</template>
<script>
export default {
name: "ossUpload.vue",
data() {
return {
//fileList是默认图片展示,可以不用管
fileList: [
{name: 'food.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'},
{name: 'food2.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}
],
ObjData:{
OSSAccessKeyId:'',
policy:'',
Signature:'',
key:'',
host:'',
dir:'',
}
};
},
methods: {
beforeUpload(file){
//在上传前进行调用
return new Promise((resolve, reject) => {
this.$axios.get("http://localhost:8080/oss/policy").then((rsp)=>{
this.ObjData.OSSAccessKeyId=rsp.data.accessid;
this.ObjData.policy=rsp.data.policy;
this.ObjData.Signature=rsp.data.signature;
this.ObjData.host=rsp.data.host; //传的OSS服务器地址
this.ObjData.key=rsp.data.dir+"${filename}";//获取文件名称
resolve(true);//继续上传
}).catch(function (error) {
console.log(error)
reject(false)//停止上传
})
})
}
}
}
</script>
<style scoped>
</style>