谷粒商城实战笔记-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/384149.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Selenium 的使用

selenium 是一个自动化测试工具&#xff0c;利用它可以驱动浏览器完成特定的操作&#xff0c;例如点击&#xff0c;下拉等&#xff0c;还可以获取浏览器当前呈现的页面的源代码&#xff0c;做到所见即所爬&#xff0c;对于一些 JavaScript 动态渲染的界面来说&#xff0c;这种爬…

封装和桥接Unity 协程体系

简介 协程&#xff08;Coroutine&#xff09;在C#中是一种特殊的函数&#xff0c;它允许开发者编写可以暂停执行并在未来某个时刻恢复执行的代码块。协程通常用于实现异步操作&#xff0c;如延时执行、等待某个事件发生、或者分段执行复杂的任务。在Unity游戏引擎中&#xff0c…

算法之递归算法

递归是非常常见的一种算法&#xff0c; 也比较难以理解&#xff0c;简而言之&#xff0c;递归就是写了一个方法&#xff0c;方法中还调用了该方法&#xff0c;相当于自己调用自己&#xff0c;如果书写不当&#xff0c;就会有堆栈溢出的风险&#xff0c;无法跳出。 所以我们编写…

内网对抗-隧道技术篇防火墙组策略HTTP反向SSH转发出网穿透CrossC2解决方案

知识点&#xff1a; 1、C2/C2上线-CrossC2插件-多系统平台支持 2、隧道技术篇-应用层-SSH协议-判断&封装&建立&穿透 3、隧道技术篇-应用层-HTTP协议-判断&封装&建立&穿透隧道技术主要解决网络通讯问题&#xff1a;遇到防火墙就用隧道技术&#xff0c;…

深入分析 Android ContentProvider (五)

文章目录 深入分析 Android ContentProvider (五)ContentProvider 的性能优化和实践案例1. 性能优化技巧1.1. 数据库索引优化示例&#xff1a;添加索引 1.2. 批量操作与事务管理示例&#xff1a;批量插入操作 1.3. 使用异步操作示例&#xff1a;使用 AsyncTask 进行异步查询 1.…

手持式气象检测设备:便携科技,气象探测

一、手持式气象检测设备&#xff1a;小巧身躯&#xff0c;大能量 手持式气象检测设备&#xff0c;顾名思义&#xff0c;是一种可以手持操作的气象监测工具。它集成了温度、湿度、气压、风速风向等多种传感器&#xff0c;能够实时获取气象数据&#xff0c;并通过显示屏或手机APP…

如何快速抓取小红书帖子评论?两大实战Python技巧揭秘

摘要&#xff1a; 本文将深入探讨两种高效的Python方法&#xff0c;助您迅速获取小红书文章下方的所有评论&#xff0c;提升市场分析与用户洞察力。通过实战示例与详细解析&#xff0c;让您轻松掌握数据抓取技巧&#xff0c;为您的内容营销策略提供有力支持。 如何快速抓取小…

上传项目到GitHub

上传项目到GitHub 前期工作&#xff1a;创建GitHub仓库 1.使用git命令初始化文件夹 git init2.将文件夹里面所有的文件添加到本地仓库&#xff0c;如果想添加单个文件&#xff0c;将.换成文件名就好。 git add .3.给文件备注&#xff0c;双引号里面是文件备注的内容 git c…

监控系列(八)部署dameng_exporter并对接prometheus

一、下载dameng_exporter采集器 官网地址&#xff1a;https://github.com/gaoyuan98/dameng_exporter DM数据库适配prometheus监控的采集器&#xff0c;目前已支持DM8数据库同时提供grafana 8.5.X 以上版本的监控面板&#xff08;其他的grafana版本需要自己绘制表盘&#xff…

Nginx 如何处理 WebSocket 连接?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 如何处理 WebSocket 连接&#xff1f;一、WebSocket 连接简介二、Nginx 处理 WebSocket 连接的基本原理三、配置 Nginx 支持 WebSocket 连接四、Nginx 中的…

MATLAB基础:数据和变量

今天我们开始学习MATLAB基础知识 1、常用非运算符及其作用 1、“,” 作为程序运行的分隔符&#xff0c;起到分隔语句的作用 2、“;” 同样作为分隔符&#xff0c;与“,”不同的是“;”会在程序运行时隐藏该行语句 如下图&#xff1a; 3、“...” 三个英文句点表示续行符…

【SpringBoot教程:从入门到精通】掌握Springboot开发技巧和窍门(四)-Vue项目配置环境、导航栏

主要写前端页面&#xff0c;采用vue框架写页面的导航栏&#xff01;&#xff01;&#xff01; 文章目录 前言 Vue项目配置环境 安装依赖 创建菜单 总结 前言 主要写前端页面&#xff0c;采用vue框架写页面的导航栏&#xff01;&#xff01;&#xff01; Vue项目配置环境 安装…

{Spring Boot 原理篇} Spring Boot自动装配原理

SpringBootApplication 1&#xff0c;Spring Boot 应用启动&#xff0c;SpringBootApplication标注的类就是启动类&#xff0c;它去实现配置类中的Bean的自动装配 SpringBootApplication public class SpringbootRedis01Application {public static void main(String[] args)…

AvaloniaUI的学习

相关网站 github:https://github.com/AvaloniaUI/Avalonia 官方中文文档&#xff1a;https://docs.avaloniaui.net/zh-Hans/docs/welcome IDE选择 VS2022VSCodeRider 以上三种我都尝试过&#xff0c;体验Rider最好。VS2022的提示功能不好&#xff0c;VSCode太慢&#xff0c…

构建基于Spring Boot的SaaS应用

引言 在设计和实现SaaS系统时&#xff0c;安全性是至关重要的考虑因素。一个全面的安全策略不仅能保护系统免受恶意攻击&#xff0c;还能确保用户数据的机密性、完整性和可用性。本文将探讨在SaaS架构中实现数据加密、敏感信息保护以及应用安全的最佳实践和技术方案&#xff0…

前端知识笔记之HTML

1.标签元素与属性&#xff0c;注意事项 2.多级标签排序List&#xff0c;无顺序&#xff08;Ul&#xff09;和有顺序(Ol) 3.HTML页面结构 4.页面跳转&#xff0c;注意#是统一页面的跳转 5.图片、视频、音频 标签 6.前端表单与后端方法 数据接收的demo 7.常见表单项 8.注意日期类…

html+css 实现水波纹按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

虚拟机配置RabbitMQ集群教程

RabbitMQ是常用的一款消息中间件&#xff0c;那么如何在我们虚拟机中创建其集群呢&#xff1f;跟着博主这篇文章让你一步到位 本篇搭建的是三台机器为一个集群&#xff01;假设大家虚拟机都为初始化状态&#xff0c;从0开始&#xff08;注意集群搭建需要CentOS8以上环境&#x…

Wordpress安装到win10(2024年7月)

目录 1.wordpress介绍 2下载应用 2.1.wordpress 2.2XAMPP 2.3 PHPmyadmin 3.配置应用 3.1XAMPP进程 3.2 文件配置 3.3 phpmyadmin配置 4.配置网页 4.1 数据库创建 4.2 安装wordpress 5.进入面板 6.总结 1.wordpress介绍 WordPress是一个开源内容管理系统&#xff0…

新校区,新视野——广州六中以太彩光打造智慧教育新高地

广州市第六中学总务处 林继青 广州市第六中学是拥有85年办学历史的著名市重点中学,也是广东省首批一级学校和国家级示范性高中。作为广州市首批智慧校园建设示范单位,广州第六中学在从化、花都新建校区的智慧校园建设中“破旧立新”,让先进的以太全光技术与学校新校区建设同频共…