尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

阿里云 OSS postObject V4 使用

阿里云 OSS postObject V4 使用
📅 发布时间:2026/6/20 23:06:46

阿里云 OSS postObject V4 使用

背景

类似预签名的方式,后端生成了签名和policy, 前端使用表单提交。

提示

如果可以,尽量使用简单的方式,比如前端用accessKeyId+accessKeySecret 的方式直接putObject.但这种方法会暴露secret。

也可以通过自己服务后台上传到aliyun oss. 但这种方式会占用自己服务的带宽。

如果使用post Object 的方式,很麻烦,官方文档也的也不好(写的跟si一样)。调试了1天,帮doubao的帮助下才搞定。

后端代码

    public AliyunOssSignatureView genSignature() throws Exception {// 步骤1:创建policy。ObjectMapper mapper = new ObjectMapper();Map<String, Object> policy = new HashMap<>();policy.put("expiration", formatISODateTime());List<Object> conditions = new ArrayList<>();Map<String, String> bucketCondition = new HashMap<>();bucketCondition.put("bucket", bucketName);conditions.add(bucketCondition);Map<String, String> signatureVersionCondition = new HashMap<>();signatureVersionCondition.put("x-oss-signature-version", "OSS4-HMAC-SHA256");conditions.add(signatureVersionCondition);Map<String, String> credentialCondition = new HashMap<>();credentialCondition.put("x-oss-credential", accessKeyId + "/" + formatISODate() +  "/" + region + "/oss/aliyun_v4_request"); // 替换为实际的 access key id
        conditions.add(credentialCondition);Map<String, String> dateCondition = new HashMap<>();dateCondition.put("x-oss-date", formateDateTimeZ());conditions.add(dateCondition);conditions.add(Arrays.asList("content-length-range", 1L, 1024L*1024*1024*5));conditions.add(Arrays.asList("eq", "$success_action_status", "201"));
//        conditions.add(Arrays.asList("starts-with", "$key", "user/eric/"));
//        conditions.add(Arrays.asList("in", "$content-type", Arrays.asList("image/jpg", "image/png")));
//        conditions.add(Arrays.asList("not-in", "$cache-control", Arrays.asList("no-cache")));
policy.put("conditions", conditions);String jsonPolicy = mapper.writeValueAsString(policy);// 步骤2:构造待签名字符串(StringToSign)。String stringToSign = new String(Base64.encodeBase64(jsonPolicy.getBytes()));// 步骤3:计算SigningKey。byte[] dateKey = hmacsha256(("aliyun_v4" + accessKeySecret).getBytes(), formatISODate());byte[] dateRegionKey = hmacsha256(dateKey, region);byte[] dateRegionServiceKey = hmacsha256(dateRegionKey, "oss");byte[] signingKey = hmacsha256(dateRegionServiceKey, "aliyun_v4_request");// 步骤4:计算Signature。byte[] result = hmacsha256(signingKey, stringToSign);String signature = BinaryUtil.toHex(result);log.info("policy:{}, base64 policy:{}, signature:{}", jsonPolicy, stringToSign, signature);return new AliyunOssSignatureView(stringToSign, signature);}public static byte[] hmacsha256(byte[] key, String data) {try {// 初始化HMAC密钥规格,指定算法为HMAC-SHA256并使用提供的密钥。SecretKeySpec secretKeySpec = new SecretKeySpec(key, "HmacSHA256");// 获取Mac实例,并通过getInstance方法指定使用HMAC-SHA256算法。Mac mac = Mac.getInstance("HmacSHA256");// 使用密钥初始化Mac对象。
            mac.init(secretKeySpec);// 执行HMAC计算,通过doFinal方法接收需要计算的数据并返回计算结果的数组。byte[] hmacBytes = mac.doFinal(data.getBytes());return hmacBytes;} catch (Exception e) {throw new RuntimeException("Failed to calculate HMAC-SHA256", e);}}/*** 获取ISO格式时间* 2024-12-03T13:00:00Z* @return current time iso format*/public static String formatISODateTime() {ZonedDateTime utcTime = ZonedDateTime.now();utcTime = utcTime.plusHours(1);return utcTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));}public static String formatISODate() {LocalDate utcDate = LocalDate.now(ZoneOffset.UTC);return utcDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));}public static String formateDateTimeZ() {ZonedDateTime utcTime = ZonedDateTime.now(ZoneOffset.UTC);return utcTime.format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'"));}

其中region 一定要注意,是类似cn-beijing 这样的,而不是oss-cn-beijing.

endpoint 是 https://bucketName.oss-cn-beijing.alyuncs.com

上面使用的base64是apache 的。不是java自带的

 

 

前端代码

 

filed的顺序一定不能错,错了就不好使

image

 policy 和 x-oss-signature 都是后端生成返回给前端。

key 是上传后的文件名称

前端可以把policy base64 decode一下。在里面取x-oss-signature-version,x-oss-credential, x-oss-date,success_action_status这些值 。

file 是要上传的文件

 

参考文档

https://help.aliyun.com/zh/oss/developer-reference/postobject

https://help.aliyun.com/zh/oss/developer-reference/signature-version-4-recommend?spm=a2c4g.11186623.0.0.700a713f3JNlJV#79752ac45behk

 

相关新闻

  • 2025年10月武汉离婚律师推荐榜:五强对比评测与选择指南
  • 用筛选过滤器修改京东界面名字
  • 对于每一个logger分别设置级别. 这样可以滤出来我们要的信息. logging里面有多个logger

最新新闻

  • 福州市仓山区吃烧烤推荐去哪家?本地实测测评 - 资讯速览
  • 全国医疗纠纷律师推荐:河北雄奕律师事务所主任齐凤,医法双修15年 - 资讯速览
  • 2026年天水学员咨询众智商学院PMP课程怎么核对官方入口? - 众智商学院官方
  • Ultimate ASI Loader:游戏MOD管理的终极解决方案
  • 基于i.MX53与MC1323x的Android RF4CE遥控器开发实战
  • 2026安徽省合肥市国防预备班招生简章最新发布,低分初三生入伍升学双路径 - cc江江

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号