伙伴云客服论坛»论坛 S区 S零代码 查看内容

0 评论

0 收藏

分享

阿里云 OSS 客户端直传 Policy 形式使用

一、OSS Policy 形式

Post policy 是阿里推出的一种安全的文件上传方式,在传统的方式一般都是客户端将文件上传至效劳端,再由效劳端将文件上传至详细的文件系统比如阿里云的OSS,这种方式不只增加了我们效劳器的带宽,而且效率也不怎么高,为此阿里提出的policy 形式,是由效劳端停止签名,客户端拿到签名后的 policy 直连阿里云的OSS停止上传文件,并且阿里也提供了上传后的回调方案。
流程如下图所示:

阿里云 OSS 客户端直传 Policy 形式使用-1.jpg

用户要上传一个文件到OSS,而且希望将上传的结果返回给应用效劳器时,需要设置一个回调函数,将恳求告知应用效劳器。用户上传完文件后,不会直接得到返回结果,而是先通知应用效劳器,再把结果转达给用户。
详细的就不做讲解了,毕竟是阿里中国的,不理解的大家可以去看下官网的介绍,下面看下使用的过程,
二、获取 Bucket 及 AccessKey ID 和 AccessKey Secret

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

首先进入OSS控制台:

阿里云 OSS 客户端直传 Policy 形式使用-2.jpg

点击Bucket:

阿里云 OSS 客户端直传 Policy 形式使用-3.jpg

创建一个

阿里云 OSS 客户端直传 Policy 形式使用-4.jpg

阿里云 OSS 客户端直传 Policy 形式使用-5.jpg

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

阿里云 OSS 客户端直传 Policy 形式使用-6.jpg

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

阿里云 OSS 客户端直传 Policy 形式使用-7.jpg

点击权限管理:

阿里云 OSS 客户端直传 Policy 形式使用-8.jpg

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

阿里云 OSS 客户端直传 Policy 形式使用-9.jpg

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

阿里云 OSS 客户端直传 Policy 形式使用-10.jpg

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

阿里云 OSS 客户端直传 Policy 形式使用-11.jpg


创建RAM用户

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

阿里云 OSS 客户端直传 Policy 形式使用-12.jpg


点击用户,开端创建用户:
阿里云 OSS 客户端直传 Policy 形式使用-13.jpg

阿里云 OSS 客户端直传 Policy 形式使用-14.jpg

主要填写下面标出来的。

阿里云 OSS 客户端直传 Policy 形式使用-15.jpg

点击确认后,会呈现该用户的AccessKey ID和AccessKey Secret,者这两个需要记下来,后面需要使用。
阿里云 OSS 客户端直传 Policy 形式使用-16.jpg

阿里云 OSS 客户端直传 Policy 形式使用-17.jpg

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

阿里云 OSS 客户端直传 Policy 形式使用-18.jpg

阿里云 OSS 客户端直传 Policy 形式使用-19.jpg


到此在阿里云上的操作根本就完成了,注意上面的bucket 的名称和域名,以及AccessKey ID 和 AccessKey Secret 后面都要使用。
三、测试是否可以上传文件

在上传创建好bucket和RAM用户后,我们就可以新建一个SpringBoot项目测试下,是否可以上传文件。
新建SpringBoot项目,在pom中引入阿里云oss的依赖:
  1. <dependency>
  2.     <groupId>com.alibaba.cloud</groupId>
  3.     <artifactId>aliyun-oss-spring-boot-starter</artifactId>
  4. </dependency>
复制代码
在配制文件中配制 access-key和 secret-key 以及 endpoint,修改application.yml文件:
  1. server:
  2.   port: 8080
  3. alibaba:
  4.   cloud:
  5.     access-key: LTAI5tJxf****MCQVK*****
  6.     secret-key: Urc3oALFm*****lF6sAzRMwEF*****
  7.     oss:
  8.       endpoint: oss-cn-shanghai.aliyuncs.com
复制代码
access-key和 secret-key就是上面创建RAM用户后得到的,endpoint是创建Bucket是选的地区,在Bucket页面的概述就可以看到。

阿里云 OSS 客户端直传 Policy 形式使用-20.jpg

下面编写测试接口:
  1. @Slf4j
  2. @RestController
  3. @RequestMapping("/file")
  4. public class UpdateController {
  5.     @Resource
  6.     OSS ossClient;
  7.     @GetMapping("/upload")
  8.     public String file() throws FileNotFoundException {
  9.         String bucketName = "bxcosstest"; // Bucket的名称
  10.         String localFile = "C:/Users/Administrator/Desktop/photo.jpg";
  11.         String fileKeyName = "photo2.jpg"; // 上传至阿里云的名称,可以使用 / 附带文件夹
  12.         InputStream inputStream = new FileInputStream(localFile);
  13.         PutObjectResult putObjectResult = ossClient.putObject(bucketName, fileKeyName, inputStream);
  14.         log.info(putObjectResult.getETag());
  15.         return "success";
  16.     }
  17. }
复制代码
下面在阅读器调用接口http://localhost:8080/file/uplOAd

阿里云 OSS 客户端直传 Policy 形式使用-21.png

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

阿里云 OSS 客户端直传 Policy 形式使用-22.jpg

已经上传胜利了,下面我们就可以使用下Policy 形式停止文件的上传了。
四、获取效劳端认证的 Policy

先修改下我们的配制文件,将Bucket的名称配制在配制文件中:
  1. alibaba:
  2.   cloud:
  3.     access-key: LTAI5tJxfVETvGMCQVKfyYpR
  4.     secret-key: Urc3oALFmRK9xWlF6sAzRMwEFpjgRt
  5.     oss:
  6.       endpoint: oss-cn-shanghai.aliyuncs.com
  7.       bucketName: bxcosstest
复制代码
创建获取Policy 的接口:
  1. @Slf4j
  2. @CrossOrigin
  3. @RestController
  4. public class PolicyController {
  5.     @Resource
  6.     OSS ossClient;
  7.     @Value("${alibaba.cloud.access-key}")
  8.     private String accessId;
  9.     @Value("${alibaba.cloud.secret-key}")
  10.     private String accessKey;
  11.     @Value("${alibaba.cloud.oss.endpoint}")
  12.     private String endpoint;
  13.     @Value("${alibaba.cloud.oss.bucketName}")
  14.     private String bucketName;
  15.     @GetMapping("/getPolicy")
  16.     public JSONObject getPolicy() throws UnsupportedEncodingException, JSONException {
  17.         // host的格式为 bucketname.endpoint
  18.         String host = StringFormatter.concat("https://", bucketName, ".", endpoint).getValue();
  19.         // callbackUrl为 上传回调效劳器的URL,请将下面的IP和Port配置为您自己的真实信息。
  20.         // String callbackUrl = "http://88.88.88.88:8888";
  21.         // 每一天产生一个文件夹
  22.         String dir = LocalDate.now().toString() + "/"; // 用户上传文件时指定的前缀,假设是 / 则自动检测为文件夹。
  23.         JSONObject jsonObject = new JSONObject();
  24.         long expireTime = 100;
  25.         long expireEndTime = System.currentTimeMillis() + expireTime * 1000; //过期时间 100 秒
  26.         Date expiration = new Date(expireEndTime);
  27.         // PostObject恳求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
  28.         PolicyConditions policyConds = new PolicyConditions();
  29.         policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
  30.         policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
  31.         String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
  32.         byte[] binaryData = postPolicy.getBytes("utf-8");
  33.         String encodedPolicy = BinaryUtil.toBase64String(binaryData);
  34.         String postSignature = ossClient.calculatePostSignature(postPolicy);
  35.         jsonObject.put("OSSAccessKeyId", accessId);
  36.         jsonObject.put("policy", encodedPolicy);
  37.         jsonObject.put("signature", postSignature);
  38.         jsonObject.put("dir", dir);
  39.         jsonObject.put("host", host);
  40.         jsonObject.put("expire", String.valueOf(expireEndTime / 1000));
  41.         return jsonObject;
  42.     }
  43. }   
复制代码
启动效劳,调用接口:http://localhost:8080/getPolicy
阿里云 OSS 客户端直传 Policy 形式使用-23.jpg

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

阿里云 OSS 客户端直传 Policy 形式使用-24.jpg

去阿里云中查看文件:

阿里云 OSS 客户端直传 Policy 形式使用-25.jpg

阿里云 OSS 客户端直传 Policy 形式使用-26.jpg


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

测试上穿的程序:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <title>文件上传</title>
  6. </head>
  7. <body>
  8. <div>
  9.     <input type="file" id="file">
  10.     <button id="upload">上传文件</button>
  11. </div>
  12. </body>
  13. <script src="js/jquery-1.10.2.min.js"></script>
  14. <script>
  15.     var filename = '';
  16.     var file = null;
  17.     $("#file").change(function () {
  18.         let f = document.getElementById("file").files[0];
  19.         if (typeof f != "undefined") {
  20.             let src = window.URL.createObjectURL(f);
  21.             if (src === null || src === '') {
  22.                 return;
  23.             }
  24.             filename = f.name;
  25.             file = f;
  26.         }
  27.     });
  28.     $("#upload").click(function () {
  29.         let data = getPolicy();
  30.         var formData = new FormData();
  31.         formData.append("OSSAccessKeyId", data.OSSAccessKeyId);
  32.         formData.append("signature", data.signature);
  33.         formData.append("policy", data.policy);
  34.         formData.append("key", data.dir + (new Date()).valueOf() + filename);//注意顺序,file要在key的后面。不然会返回找不到key 的错误
  35.         formData.append("file", file);
  36.         formData.append("success_action_status", 200);
  37.         $.ajax({
  38.             url: data.host,
  39.             type: "POST",
  40.             data: formData,
  41.             contentType: false,
  42.             processData: false,
  43.             success: function (data, status, response) {
  44.                 if (status === 'success') {
  45.                     alert("上传胜利!")
  46.                 }
  47.             },
  48.             error: function (e) {
  49.                 alert("上传失败!");
  50.                 console.log("失败", e);
  51.             }
  52.         });
  53.     });
  54.     function getPolicy() {
  55.         var restultData = null;
  56.         $.ajax({
  57.             url: "http://localhost:8080/getPolicy",
  58.             type: "GET",
  59.             async: false,
  60.             success: function (data, status, request) {
  61.                 if (status === 'success') {
  62.                     restultData = data;
  63.                 }
  64.             },
  65.             error: function (e) {
  66.                 console.log("失败", e);
  67.             }
  68.         });
  69.         return restultData;
  70.     }
  71. </script>
  72. </html>
复制代码
测试

阿里云 OSS 客户端直传 Policy 形式使用-27.jpg

查看阿里云Bucket控制页面:

阿里云 OSS 客户端直传 Policy 形式使用-28.jpg

阿里云 OSS 客户端直传 Policy 形式使用-29.jpg

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

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

伙伴的伙伴
注册会员
主题 27
回复 16
粉丝 0
|网站地图
快速回复 返回顶部 返回列表