document
API test
第三方

获取签名

GET
http://localhost:88/api/thirdpart/oss//policy

API description

获取上传OSS的文件签名

Response Parameters

parameter
type
description
required
msg
string
示例:success
required
code
int
示例:0
required
data
object
数据字典
required
accessid
string
示例:LTAI5tMEp7aLt2bzXB1wThW5
required
policy
string
示例:eyJleHBpcmF0aW9uIjoiMjAyMy0wNy0xMlQwMToxNjozNy42OTJaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA0ODU3NjAwMF0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCIyMDIzLTA3LTEyLyJdXX0=
required
signature
string
示例:P0qNVe6vexF+B/k4wgB6O6Ci8k0=
required
dir
string
示例:2023-07-12/
required
host
string
示例:https://bitmall-oss.oss-cn-guangzhou.aliyuncs.com
required
expire
string
示例:1689124597
required

Description or Example

# Error解决 ## 组件无法注入怎么办? > 例如这里的OSSClient组件, 如果无法注入, 我们的一般思路是找到对应的自动配置类即AutoConfiger后缀的自动配置类, 如果这里找不到, 我们可以继续找对应的ContextAutoConfiger全局自动配置类, 这样分析组件注入的情况 ## 图片无法回显? ![image.png](https://cos.easydoc.net/13568421/files/ljz1zsgw.png) ![image.png](https://cos.easydoc.net/13568421/files/ljz203j1.png) **通过比较发现, endpoint那里和实际上的endpoint有所不同, 通过比较发现, 是解析yaml出现了问题, 即解析的路径写错了** >**总结: 如果是浏览器抛红, 一般和网络地址有关** # 核心代码 ```java @Value("${spring.cloud.alicloud.access-key}") private String accessId; @Value("${spring.cloud.alicloud.secret-key}") private String accessKey; @Value("${spring.cloud.alicloud.oss.endpoint}") private String endpoint; @Value("${spring.cloud.alicloud.bucket-name}") private String bucket; @Autowired private OSS ossClient; @RequestMapping("/policy") public R getPolicy() { String accessId = this.accessId; String accessKey = this.accessKey; String endpoint = this.endpoint; // 填写Bucket名称,例如examplebucket。 String bucket = this.bucket; // 填写Host地址,格式为https://bucketname.endpoint。 String host = "https://" + bucket + "." + endpoint; // 设置上传回调URL,即回调服务器地址,用于处理应用服务器与OSS之间的通信。OSS会在文件上传完成后,把文件上传信息通过此回调URL发送给应用服务器。 // String callbackUrl = "https://192.168.0.0:8888"; // 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。 String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); String dir = date + "/"; 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(StandardCharsets.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)); // respMap.put("expire", formatISO8601Date(expiration)); } catch (Exception e) { // Assert.fail(e.getMessage()); System.out.println(e.getMessage()); } return R.ok().put("data", respMap); } ``` # 扩展知识 ## 为什么使用`@Value`获取属性? > 使用`@Value`获取属性可以降低这些参数和代码的耦合度, 当我们想更改OSS源的时候可以直接在配置文件修改, 避免了修改源码导致的重启 ## 为什么放在日期目录里面? > 这里规定同一个日期的文件放在同一个日期目录, 便于后端管理维护文件 ## 为什么文件加上一个UUID? > 用户极有可能上传同名文件, 避免互相覆盖