当前位置: 首页 > news >正文

谷粒商城实战笔记-63-商品服务-API-品牌管理-OSS获取服务端签名

文章目录

  • 一,创建第三方服务模块thrid-party
    • 1,创建一个名为`gulimall-third-party`的模块
    • 2,nacos上创建third-party命名空间,用来管理这个服务的所有配置
    • 3,配置pom文件
    • 4,配置文件
    • 5,单元测试
    • 6,增加网关路由配置
  • 二,后台提供生成密钥的接口
    • 代码解释
    • 使用说明
  • 问题记录

一,创建第三方服务模块thrid-party

在这里插入图片描述
根据图片的架构设计,前端上传文件的步骤如下:

  • ①从后台获取签名
  • ②携带签名将文件上传至阿里云OSS

因此,上传文件涉及到第三方服务阿里云OSS,以后还会有第三方短信服务等,为了统一管理第三方服务,创建一个专门的模块third-party。

1,创建一个名为gulimall-third-party的模块

在这里插入图片描述

2,nacos上创建third-party命名空间,用来管理这个服务的所有配置

在这里插入图片描述

3,配置pom文件

OSS相关的包依赖:

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

4,配置文件

application.properties。

server.port=30000
alibaba.cloud.secret-key=fzQdkkAR4D1dRopvBC40d1202jgb
alibaba.cloud.access-key=LTAI5tC6QtV3C5dzq7uau
alibaba.cloud.oss.endpoint=oss-cn-hangzhou.aliyuncs.com
spring.application.name=gulimall-third-party
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

bootstrap.yml。

spring:application:name: gulimall-third-partycloud:nacos:config:server-addr: 127.0.0.1:8848namespace: 0ae75f1a-5bd3-4113-aec9-aad4a23403d7

5,单元测试

编写单元测试。

package com.atguigu.gulimall.thirdparty;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyuncs.exceptions.ClientException;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.io.File;@SpringBootTest
@RunWith(SpringRunner.class)
class GulimallThirdPartyApplicationTests {@Autowiredprivate OSS ossClient;@Testvoid contextLoads() {}@Testpublic void testUpload() throws ClientException {String bucketName = "gulimallfuck";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "134.png";// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。String filePath= "C:\\Users\\Lenovo\\Desktop\\1.png";// 创建OSSClient实例。try {// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));// 上传文件。PutObjectResult result = ossClient.putObject(putObjectRequest);} catch (Exception oe) {oe.printStackTrace();}}}

6,增加网关路由配置

在这里插入图片描述

        - id: gulimall-third-partyuri: lb://gulimall-third-partypredicates:- Path=/api/thirdparty/**filters:- RewritePath=/api/thirdparty/(?<segment>.*),/$\{segment}

二,后台提供生成密钥的接口

参考阿里云OSS文档,后端生成密钥的代码如下。

package com.atguigu.gulimall.thirdparty.controller;import com.aliyun.oss.OSS;
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 com.atguigu.common.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;/*** @Description:* @Created: with IntelliJ IDEA.* @createTime: 2020-05-27 15:56**//****/
@RestController
public class OssController {@Value("${alibaba.cloud.access-key}")private String accessKeyId;@Value("${alibaba.cloud.oss.endpoint}")private String endpoint;@Autowiredprivate OSS ossClient;@RequestMapping("/oss/policy")public R policy() {String bucket = "gulimallfuck"; // 请填写您的 bucketname 。String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint// callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());String dir = format + "/"; // 用户上传文件时指定的前缀。// 创建OSSClient实例。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("utf-8");String encodedPolicy = BinaryUtil.toBase64String(binaryData);String postSignature = ossClient.calculatePostSignature(postPolicy);respMap = new LinkedHashMap<String, String>();respMap.put("accessid", accessKeyId);respMap.put("policy", encodedPolicy);respMap.put("signature", postSignature);respMap.put("dir", dir);respMap.put("host", host);respMap.put("expire", String.valueOf(expireEndTime / 1000));} catch (Exception e) {System.out.println(e.getMessage());} finally {ossClient.shutdown();}return R.ok().put("data",respMap);}}

这段代码展示了如何生成一个预签名的策略(policy),允许客户端通过POST方式上传文件到阿里云OSS服务。policy方法返回了一个LinkedHashMap类型的respMap,该映射包含了客户端上传文件所需的参数。下面是respMap中各个键值对的作用解释:

  1. accessid:

    • 作用: 客户端上传文件时的身份标识,即Access Key ID。
    • 用途: 验证客户端的身份。
  2. policy:

    • 作用: 一个Base64编码的JSON字符串,定义了上传文件的策略条件。
    • 用途: 客户端上传文件时需要携带此策略,以满足预设的限制条件。
  3. signature:

    • 作用: 对policy进行签名的结果,确保策略的完整性和安全性。
    • 用途: 客户端上传文件时需要携带此签名,以证明策略的有效性。
  4. dir:

    • 作用: 文件上传的目标目录前缀。
    • 用途: 指定文件上传后的存储位置前缀,便于组织和管理文件。
  5. host:

    • 作用: OSS服务的访问域名。
    • 用途: 客户端通过此域名发起上传请求。
  6. expire:

    • 作用: 策略的有效截止时间(以秒为单位的时间戳)。
    • 用途: 客户端必须在此时间戳之前完成文件上传。

代码解释

假设我们想要允许客户端上传文件到名为gulimallfuck的Bucket中,并且文件会被存储在2023-07-25/目录下。policy方法会生成一个策略,该策略包含以下限制:

  • 文件大小范围在0到1048576000字节之间。
  • 文件名必须以2023-07-25/开头。

客户端在发起POST请求时需要携带这些参数,以符合策略的要求。如果所有条件都满足,文件将被成功上传到OSS。

使用说明

  1. 客户端生成表单:

    • 客户端(通常是前端JavaScript代码)会根据返回的respMap构建一个HTML表单,包含所有的必要字段。
  2. 表单提交:

    • 当用户选择文件后,表单会通过POST方式提交到OSS服务,文件作为表单的一部分被上传。
  3. OSS验证:

    • OSS服务会验证accessidpolicysignature,确保它们有效且符合策略条件。
  4. 文件存储:

    • 如果验证通过,文件将被存储在指定的Bucket和目录中。

问题记录

参考文章:https://blog.csdn.net/epitomizelu/article/details/140608401

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • GO发票真伪批量查验方法、数电票查验接口
  • 系统移植(七)u-boot移植 ④ trusted版本
  • Flume安装部署
  • 先用先发!小样本故障诊断新思路!Transformer-SVM组合模型多特征分类预测/故障诊断(Matlab)
  • Unity横板动作游戏 -为什么我又开始学习Unity,而不是Godot。
  • SteerLM_ Attribute Conditioned SFT as an (User-Steerable) Alternative to RLHF
  • 从零开始学习网络安全渗透测试之基础入门篇——(四)反弹SHELL不回显带外正反向连接防火墙出入站文件上传下载
  • Mysql in 与 exists
  • ObservableCollection新增数据前判断数据是否存在
  • The Llama 3 Herd of Models.Llama 3 模型第1,2,3部分全文
  • STM32单片机C语言:继电器控制220v灯泡亮灭
  • web3d值得学习并长期发展,性价比高吗?
  • socket 编程
  • 数据库作业——5
  • Kafka系列之如何提高消费者消费速度
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Debian下无root权限使用Python访问Oracle
  • HTTP--网络协议分层,http历史(二)
  • input实现文字超出省略号功能
  • java 多线程基础, 我觉得还是有必要看看的
  • Javascript Math对象和Date对象常用方法详解
  • Javascript基础之Array数组API
  • Mysql优化
  • python学习笔记 - ThreadLocal
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 从零开始在ubuntu上搭建node开发环境
  • 解析 Webpack中import、require、按需加载的执行过程
  • 蓝海存储开关机注意事项总结
  • 使用common-codec进行md5加密
  • 数据可视化之 Sankey 桑基图的实现
  • 详解移动APP与web APP的区别
  • 阿里云ACE认证学习知识点梳理
  • 数据库巡检项
  • ​2020 年大前端技术趋势解读
  • ‌内网穿透技术‌总结
  • #QT(TCP网络编程-服务端)
  • (1)常见O(n^2)排序算法解析
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (篇九)MySQL常用内置函数
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (算法)Travel Information Center
  • (算法)大数的进制转换
  • (算法)区间调度问题
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)winform之ListView
  • .describe() python_Python-Win32com-Excel
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .naturalWidth 和naturalHeight属性,
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET学习教程二——.net基础定义+VS常用设置