一、OSS Policy 模式

Post policy 是阿里推出的一种安全的文件上传方式,在传统的方式一般都是客户端将文件上传至服务端,再由服务端将文件上传至具体的文件系统比如阿里云的OSS,这种方式不仅增加了我们服务器的带宽,而且效率也不怎么高,为此阿里提出的policy 模式,是由服务端进行签名,客户端拿到签名后的 policy 直连阿里云的OSS进行上传文件,并且阿里也提供了上传后的回调方案。

流程如下图所示:

用户要上传一个文件到OSS,而且希望将上传的结果返回给应用服务器时,需要设置一个回调函数,将请求告知应用服务器。用户上传完文件后,不会直接得到返回结果,而是先通知应用服务器,再把结果转达给用户。

具体的就不做讲解了,毕竟是阿里中国的,不了解的大家可以去看下官网的介绍,下面看下使用的过程,

二、获取 Bucket 及 AccessKey ID 和 AccessKey Secret

在操作之前确保已经开通了OSS功能。

创建 Bucket

首先进入OSS控制台:

点击Bucket:

创建一个


主要填写bucket名称和地域,其他看具体情况选择。填写后点击下面的确认按钮。下面自动跳转的页面就可以看到bucket 的域名了。

下面我们上传和下载都需要使用这个域名,这里还需要配制bucket的跨域允许,因为我们是客户端直连肯定存在跨域问题。

点击 bucket列表,进入刚才创建的bucket

点击权限管理:

下面就有一个跨域设置了。

点击设置,创建一个规则:

主要设置来源和请求方式即可,来源不做限制就填写*即可。

创建RAM用户

下面还需创建一个RAM用户,回到最初的OSS控制台页面,右边常用入口由访问控制RAM,点击它进入RAM控制台。

点击用户,开始创建用户:



主要填写下面标出来的。

点击确认后,会出现该用户的AccessKey IDAccessKey Secret,者这两个需要记下来,后面需要使用。

下面需要给该用户分配OSS的权限,点击该页面的左边菜单的用户,出现用户列表,列表中添加权限的操作。

到此在阿里云上的操作基本就完成了,注意上面的bucket 的名称和域名,以及AccessKey IDAccessKey Secret 后面都要使用。

三、测试是否可以上传文件

在上传创建好bucket和RAM用户后,我们就可以新建一个SpringBoot项目测试下,是否可以上传文件。

新建SpringBoot项目,在pom中引入阿里云oss的依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId>
</dependency>

在配制文件中配制 access-keysecret-key 以及 endpoint,修改application.yml文件:

server:port: 8080alibaba:cloud:access-key: LTAI5tJxf****MCQVK*****secret-key: Urc3oALFm*****lF6sAzRMwEF*****oss:endpoint: oss-cn-shanghai.aliyuncs.com

access-keysecret-key就是上面创建RAM用户后得到的,endpoint是创建Bucket是选的地区,在Bucket页面的概述就可以看到。

下面编写测试接口:

@Slf4j
@RestController
@RequestMapping("/file")
public class UpdateController {@ResourceOSS ossClient;@GetMapping("/upload")public String file() throws FileNotFoundException {String bucketName = "bxcosstest"; // Bucket的名称String localFile = "C:/Users/Administrator/Desktop/photo.jpg";String fileKeyName = "photo2.jpg"; // 上传至阿里云的名称,可以使用 / 附带文件夹InputStream inputStream = new FileInputStream(localFile);PutObjectResult putObjectResult = ossClient.putObject(bucketName, fileKeyName, inputStream);log.info(putObjectResult.getETag());return "success";}
}

下面在浏览器调用接口http://localhost:8080/file/upload

已经打印出Etag,看下阿里云的bucket的控制台:

已经上传成功了,下面我们就可以使用下Policy 模式进行文件的上传了。

四、获取服务端认证的 Policy

先修改下我们的配制文件,将Bucket的名称配制在配制文件中:

alibaba:cloud:access-key: LTAI5tJxfVETvGMCQVKfyYpRsecret-key: Urc3oALFmRK9xWlF6sAzRMwEFpjgRtoss:endpoint: oss-cn-shanghai.aliyuncs.combucketName: bxcosstest

创建获取Policy 的接口:

@Slf4j
@CrossOrigin
@RestController
public class PolicyController {@ResourceOSS ossClient;@Value("${alibaba.cloud.access-key}")private String accessId;@Value("${alibaba.cloud.secret-key}")private String accessKey;@Value("${alibaba.cloud.oss.endpoint}")private String endpoint;@Value("${alibaba.cloud.oss.bucketName}")private String bucketName;@GetMapping("/getPolicy")public JSONObject getPolicy() throws UnsupportedEncodingException, JSONException {// host的格式为 bucketname.endpointString host = StringFormatter.concat("https://", bucketName, ".", endpoint).getValue();// callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。// String callbackUrl = "http://88.88.88.88:8888";// 每一天产生一个文件夹String dir = LocalDate.now().toString() + "/"; // 用户上传文件时指定的前缀,如果是 / 则自动检测为文件夹。JSONObject jsonObject = new JSONObject();long expireTime = 100;long expireEndTime = System.currentTimeMillis() + expireTime * 1000; //过期时间 100 秒Date expiration = new Date(expireEndTime);// PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。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);jsonObject.put("OSSAccessKeyId", accessId);jsonObject.put("policy", encodedPolicy);jsonObject.put("signature", postSignature);jsonObject.put("dir", dir);jsonObject.put("host", host);jsonObject.put("expire", String.valueOf(expireEndTime / 1000));return jsonObject;}
}

启动服务,调用接口:http://localhost:8080/getPolicy


下面使用拿到的参数使用PostMan上传文件测试:

去阿里云中查看文件:

五、前端使用认证后的 Policy 上传文件

测试上穿的程序:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>文件上传</title>
</head>
<body>
<div><input type="file" id="file"><button id="upload">上传文件</button>
</div>
</body><script src="js/jquery-1.10.2.min.js"></script>
<script>var filename = '';var file = null;$("#file").change(function () {let f = document.getElementById("file").files[0];if (typeof f != "undefined") {let src = window.URL.createObjectURL(f);if (src === null || src === '') {return;}filename = f.name;file = f;}});$("#upload").click(function () {let data = getPolicy();var formData = new FormData();formData.append("OSSAccessKeyId", data.OSSAccessKeyId);formData.append("signature", data.signature);formData.append("policy", data.policy);formData.append("key", data.dir + (new Date()).valueOf() + filename);//注意顺序,file要在key的后面。不然会返回找不到key 的错误formData.append("file", file);formData.append("success_action_status", 200);$.ajax({url: data.host,type: "POST",data: formData,contentType: false,processData: false,success: function (data, status, response) {if (status === 'success') {alert("上传成功!")}},error: function (e) {alert("上传失败!");console.log("失败", e);}});});function getPolicy() {var restultData = null;$.ajax({url: "http://localhost:8080/getPolicy",type: "GET",async: false,success: function (data, status, request) {if (status === 'success') {restultData = data;}},error: function (e) {console.log("失败", e);}});return restultData;}</script>
</html>

测试

查看阿里云Bucket控制页面:


喜欢的小伙伴可以关注我的个人微信公众号,获取更多学习资料!

阿里云 OSS 客户端直传 Policy 模式使用相关推荐

  1. php阿里云oss文件上传

    php的文件上传 文件上传 php的文件上传放在了$_FILES数组里,单文件和多文件上传的区别在于$_FILES['userfile']['name']是否为数组, 不熟悉的可以读一下官方文档 单文 ...

  2. 海量数据大课学习笔记(12)-账号微服务-阿里云OSS接入实战-小滴课堂

    文章目录 前言 第1集 分布式文件存储业界常见解决方案介绍 第2集 阿里云OSS分布式对象存储介绍开通 第3集 权限知识 RBAC-ACL模式应用之阿里云RAM访问控制 第4集 阿里云OSS客户端SD ...

  3. 文件分片上传阿里云OSS

    本文参考其他博客并结合自身编写 博客原作者:程序猿谢哥哥 博客原地址:https://blog.csdn.net/weixin_42825651/article/details/108792264 注 ...

  4. Java使用阿里云OSS对象存储上传图片

    示例说明   该案例是OSS Java SDK的示例程序,您可以修改endpoint.accessKeyId.accessKeySecret.bucketName后直接运行. 本示例中的并不包括OSS ...

  5. 第三方存储系统(一):阿里云OSS云存储配置及Java上传接口设计

    第三方存储系统(一):阿里云OSS云存储配置及Java上传接口设计 项目开发中,为了实现静态资源分离,提高系统运行的速率和稳定性,我们会把资源文件剥离出项目系统.而搭建文件存储系统就成为了不可或缺的工 ...

  6. java通过URL获取网络文件并上传到阿里云OSS文件服务器

    首先,先从网络上读取到文件 /*** 从网络Url中读取文件* @param urlStr 文件URL地址* @throws IOException*/public String downLoadFr ...

  7. 上传阿里云oss对象型存储 本地文件和上传流上传

    上传阿里云oss对象型存储 本地文件和上传流上传 import java.io.ByteArrayInputStream; import java.io.File; import java.io.Fi ...

  8. Java中阿里云OSS文件上传工具类

    阿里云OSS文件上传下载工具类 前言: 本质上就是获取配置文件信息,然后注入bean,调用sdk中提供的增删改方法: 为了避免同名文件会替换,用了hutool中唯一id生成+文件名做拼接 导入依赖:→ ...

  9. 前端阿里云OSS直传,微信小程序版本

    前言: 网络上许多的文章资料,全是使用阿里云官方的SDK,ali-oss插件去做直传.可是各位素未谋面的朋友要注意,这个SDK它支持web环境使用,也就是PC端浏览器. 当项目环境切换到微信小程序,是 ...

  10. 微信小程序:阿里云OSS直传实践-PHP实现服务端签名

    目录 1.阿里云OSS上传方式 1.1.Web端Browser.js SDK直传(不推荐) 1.2.Web端上传服务端再上传至OSS 1.3.服务端签名后Web端直传(推荐) 2.PHP服务端生成签名 ...

最新文章

  1. SQL Server中的事务与锁
  2. servlet3异步_Servlet 3的异步Servlet功能
  3. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 25丨求团队人数【难度中等】​
  4. Python2.7-sqlite3
  5. 最全面的MySQL面试题大全-二
  6. 大数据_Flink_Java版_数据处理_流处理API_Transform(5)_union合流---Flink工作笔记0034
  7. 有向图的十字链表存储
  8. 学用MVC4做网站五:5.2我的文章
  9. 传输层的几个部分的ALCAP、SSCOP、MTP3-B、SCCP、SAAL、SCCF、STC、IP、UDP、GTPU
  10. 【笔记】软件质量保证(Software Quality Assurance)复习笔记
  11. 最近大火的「元宇宙」究竟是什么
  12. 中学生编程大赛_青少年编程竞赛汇总
  13. java取万位的值,Excel中表格数值进行取万位整数的操作方法
  14. NUC140之I2C和AT24C32
  15. 1 自定义无边框窗体
  16. 2021年美容师(初级)考试资料及美容师(初级)
  17. 高仿英雄联盟游戏网页制作作业 英雄联盟LOL游戏HTML网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
  18. iPhone Plus手机的分辨率到底是多少,是1080×1920还是1242×2208?
  19. CreateThread和_beginthread区别及使用http://blog.csdn.net/wxq1987525/article/details/6620210
  20. itest英语考试bug_iTEST爱考试

热门文章

  1. WD西部数据2TB,2.5寸移动硬盘,因为磁头坏了,长时间通电导致划片划伤,维修过程通过反复更换磁头
  2. 亲自体验了vscode网页版开发代码并提交代码到github代码库,发现出奇的流畅,手机和平板也可以很愉快的编写代码了
  3. OAuth2资源服务器
  4. Windows必备程序 | CleanMyPC安装教程
  5. Java 中的十大排序算法
  6. AOSP 隐藏 su
  7. 3DMAX卸载/完美解决安装失败/如何彻底卸载清除干净3DMAX各种残留注册表和文件的方法
  8. opencv4下使用SVM进行简单颜色分类
  9. 常见概率模型在市场中的应用
  10. for循环及判断语句的20个经典习题