参考文档 : 点击查看
文章目录
- 运行环境
- 一、OSS相关概念
- 1.1 Storage Class 存储类型
- 1.2 Bucket 存储空间
- 1.3 Object 对象
- 1.4 Region 地域
- 1.5 Endpoint 访问域名
- 1.6 AccessKet 访问密钥
- 二、使用阿里云OSS服务
- 2.1 开通OSS服务
- 2.2 创建 Bucket(存储空间)
- 2.3 在网页上传文件
- 2.4 创建用户,生成AccesskeyID与Secret
- 2.5 为用户添加读权限
- 三、使用JavaSDK操作OSS
- 3.1 操作一:测试连接
- 3.2 操作二:本地上传文件
- 3.3 操作三:在Web项目里实现OSS上传
- 设置CORS解决跨域问题
官方文档:点击查看
OSS 全称 Object Storage Service,即对象存储服务,是由阿里云提供的海量、安全、低成本、高可靠的云存储服务。
OSS具有与平台无关的RESTful API接口,可在任意应用、任意地点存储与访问任何类型的数据。网站的图片、视频等文件就可以存放在OSS中(海量数据,交给阿里云平台维护,安全可靠)
有标准、低频访问、归档、冷归档四种存储类型,价格依次递减
标准:高持久、高可哦那个、高性能,支持频繁的数据访问
低频访问:适合长期保存不经常访问的数据(平均每月1-2次频率)
归档:适合需长期保存(建议半年以上)的数据
冷归档:适合超长事件存放的极冷数据
存储空间是用于存储对象(Object)的容器。
具有各种配置属性,包括地域、访问权限、存储类型等。
OSS存储数据的基本单元,同时被称作OSS的文件。
Object 由Object Meta、Data和Key组成,即元信息、用户数据和文件名。
Object 由 Bucket内部唯一的Key来表示
Object Meta 元信息是一组键值对,表示了Object的一些属性,比如最后修改时间、大小等信息,同时也可以自定义信息。
OSS的数据中心所在物理位置,在创建Bucket时徐选择合适的地域。
OSS对外服务的访问域名,通过域名存储、获取对象。
AccessKey 简称AK,指访问身份验证中用到的AK ID 和 AK Secret,前者用于标识用户,后者表示该用户的密钥。
访问阿里云官网:https://oss.console.aliyun.com/
注册账号(过程略)后搜索OSS对象存储服务,点击立即开通
在OSS管理页面中创建存储空间(Bucket)
按照自己的需求进行设置
用途一:手动上传文件
AccessKey就相当于一个账号和密码,可以视为小号,这里主要用于访问之前创建的存储空间。
将鼠标移至阿里云网站右上角的头像,选择访问控制,
第二步,点击创建用户
第三步,设置登录名称和显示名称后,选中Open API 调用访问选择框
第四步,创建用户成功,自动生成了AccessKey对应的ID和Secret
第二步,根据需要添加权限,比如管理OSS权限还有只读OSS的权限
官方文档:点击查看
第一步,Maven引入依赖
pom.xml
<dependency>
<groupId>com.aliyun.ossgroupId>
<artifactId>aliyun-sdk-ossartifactId>
<version>3.13.2version>
dependency>
第二步,编写Java代码,(其他地域的访问映射 点击访问)
package com.uni;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
public class testOSS {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。关于其他Region对应的Endpoint信息,请参见访问域名和数据中心。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "创建用户时生成的Bucket ID";
String accessKeySecret = "创建用于时生成的Bucket Secret";
String bucketName = "创建的用户";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 创建存储空间。
ossClient.createBucket(bucketName);
} 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());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
参考官方文档:点击查看
第一步,导入Maven依赖(和之前一样)
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.13.2</version>
</dependency>
第二步,参考官方提供的代码,编写JavaWeb上传文件的Java代码
package com.uni;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import java.io.File;
public class testOSS {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "你的Bucket ID";
String accessKeySecret = "你的 Bucket Secret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "unirithe";
// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "pom.xml";
// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
String filePath= "D:\\pom.xml";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// 上传文件。
ossClient.putObject(putObjectRequest);
} 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());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
本次案例采取直接在后端传输文件到OSS,还有一种方法是从后端发送签名到前端,由前端进行发送,后者效率更高,这里没有继续深入,暂时用后端实现简单的上传。
由于函数回调需要用到公网IP,这里就不测试了。
官方参考文档:点击查看
第一步,导入SDK Maven依赖(Web相关的依赖这里忽略了,请自行添加)
pom.xml
<dependency>
<groupId>com.aliyun.ossgroupId>
<artifactId>aliyun-sdk-ossartifactId>
<version>3.13.2version>
dependency>
第二步,编写Controller层代码
package com.uni.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
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 org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@RestController
public class OssController {
@GetMapping("/oss/test")
public String testOss(){
String accessId = "待填写"; // 请填写您的AccessKeyId。
String accessKey = "待填写"; // 请填写您的AccessKeySecret。
String endpoint = "待填写"; // 请填写您的 endpoint,比如杭州oss-cn-hangzhou.aliyuncs.com。
String bucket = "待填写"; // 请填写您的 bucketname 。
String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint
// jasonCallback 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
// String callbackUrl = "http://localhost:8080/oss/test";
String dir = DateTimeFormatter.ofPattern("yyyy-MM-dd-").format(LocalDateTime.now()) + "/"; // 用户上传文件时指定的前缀。
Map<String, String> respMap = new LinkedHashMap<String, String>();
JSONObject jasonCallback = new JSONObject();
// 创建OSSClient实例
OSS client = new OSSClientBuilder().build(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(StandardCharsets.UTF_8);
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = client.calculatePostSignature(postPolicy);
System.out.println("policy:" + Arrays.toString(binaryData));
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));
// jasonCallback.put("callbackUrl", callbackUrl);
// jasonCallback.put("callbackBody",
// "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
// jasonCallback.put("callbackBodyType", "application/x-www-form-urlencoded");
// String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes());
// respMap.put("callback", base64CallbackBody);
// response.setHeader("Access-Control-Allow-Origin", "*");
// response.setHeader("Access-Control-Allow-Methods", "POST");
} catch (Exception e) {
System.out.println(e.getMessage());
}
return JSON.toJSONString(new HashMap<String, Object>(){{
put("Code", 1);
put("Status", "success");
put("items" ,respMap);
// put("jasonCallback", jasonCallback);
}});
}
}
第三步,下载客户端进行回调测试
OSS 修改 CORS,解决跨域问题
根据自身需要设置跨域规则
再次访问前端项目,上传成功!