【25-业务开发-基础业务-品牌管理-图片管理-图片上传方式的三种实现方式-第三方公共服务模块集成到项目中-服务端生成签名实战】

本文详细介绍了一款高性能商城系统中的图片上传功能实现方法,包括三种上传方式对比及服务端生成签名的实战过程。

一.知识回顾

【0.三高商城系统的专题专栏都帮你整理好了,请点击这里!】
【1-系统架构演进过程】
【2-微服务系统架构需求】
【3-高性能、高并发、高可用的三高商城系统项目介绍】
【4-Linux云服务器上安装Docker】
【5-Docker安装部署MySQL和Redis服务】
【6-Git安装与配置过程、Gitee码云上创建项目、IDEA关联克隆的项目】
【7-创建商城系统的子模块并将修改后的信息使用Git提交到Gitee上】
【8-数据库表结构的创建&后台管理系统的搭建】
【9-前端项目的搭建部署、Node安装、VSCode安装】
【10-Node的安装以及全局环境变量的相关配置&解决启动报错的问题(1.Error: Cannot find module ‘fs/promises)(2.npm安装node-sass报错)】
【11-导入人人generator项目并自动生成相关的文件&商品子模块的调试&公共模块common子模块的抽离与实现&Lombok插件的安装】
【12-商品子模块整合MyBatisPlus技术&其它模块通过generator的自动生成与补充完善】
【13-项目中微服务组件的学习-SpringCloudAlibaba微服务生态体系的学习&SpringCloudAlibaba的依赖管理&项目中SpringBoot和SpringCloud版本的统一】
【14-微服务的注册中心与配置中心Nacos&Windows操作系统上安装Nacos和Linux操作系统上用Docker中安装Nacos&每个子项目模块使用Nacos进行服务注册与发现】
【15-项目中服务的远程调用之OpenFeign&订单模块与商品模块集成使用OpenFeign的案例】
【16-配置中心之Nacos的基本使用&Nacos服务之命令空间、Nacos服务之配置组、Nacos服务之配置拆分】
【17-微服务网关之Spring Cloud Gateway&Spring Cloud Gateway网关服务搭建】
【18-业务开发-基础业务-商品模块-分类管理-前后端管理系统的启动-为分类管理表增加数据-Json插件的下载-返回具有层级目录、父子关系结构的数据】
【19-业务开发-基础业务-商品模块-分类管理-管理系统新建菜单-后端项目renren注册到Nacos注册中心和配置中心去-项目gateway网关模块的搭建-浏览器的同源策略与解决跨域问题实操案例】
【20-业务开发-基础业务-商品模块-分类管理-前端展示后端具有层级关系的目录数据-商品系统三级分类的逻辑删除前后端代码实现】
【21-业务开发-基础业务-商品模块-分类管理-商品系统三级分类的新增类别前后端代码实现-商品系统三级分类的更新类别前后端代码实现-之前错误的Bug修正】
【22-业务开发-基础业务-商品模块-分类管理-商品系统三级分类拖拽页面的功能-前后端代码的逻辑实现-访问测试-拖拽开关的开启和关系-批量更新拖拽数据-批量删除选定数据】
【23-业务开发-基础业务-品牌管理-品牌管理项目搭建-品牌管理实现的增删改查操作测试-后端数据显示状态使用前端组件开关按钮展示-以及数据处理以及测试】
【24-业务开发-基础业务-品牌管理-图片管理-阿里云OSS服务开通和使用-阿里云OSS服务API使用-SpringCloudAlibaba OSS服务的使用】

二.图片上传方式的三种实现方式

2.1 第一种方式

表单提交同步将表单数据和图片都提交到后端服务器中,然后在后端服务器中将图片再上传到阿里云服务中。

在这里插入图片描述

但是这种方式的缺点是要做两次上传操作,还有就是将图片和正常的表单信息一起提交影响正常业务的效率。

2.2 第二种方式

第二种方式就是在客户端直接将图片上传到阿里云服务器中,返回访问的url地址,然后将url访问地址传递到后端服务进而保存在数据库中。

在这里插入图片描述

这种方式的缺点是在客户端需要获取AccessKey和SecuretKey,这样将相关的核心数据暴露在前端不安全。

2.3 第三种方式

第三种方式就是客户端向服务器获取阿里云的防伪签名,然后直接将图片通过防伪签名上传到阿里云服务器中。这样既提高了效率又保证了安全。

在这里插入图片描述

三.mall-third-party模块集成第三方公共服务

清楚了文件上传的方式后,客户端需要从服务器中获取服务防伪签名信息,同时我们后面还有很多其他的第三方服务,比如发送短信等,这时我们可以专门创建一个第三方的服务来处理这些请求。

在这里插入图片描述

修改pom文件中的SpringBoot的版本和SpringCloud的版本使其和其他模块的版本保持一致,然后同步注册中心和配置中心的操作。引入阿里云OSS服务的相关API,并测试即可

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ljw.mall</groupId>
    <artifactId>mall-third-party</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mall-third-party</name>
    <description>第三方服务</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.ljw.mall</groupId>
            <artifactId>mall-commons</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <!--排除相关依赖,否则启动报错--> 
            <exclusions>
                <exclusion>
                    <groupId>com.baomidou</groupId>
                    <artifactId>mybatis-plus-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

属性文件:application.yml

spring:
  cloud: # 配置nacos的地址
    nacos:
      discovery:
        server-addr: Nacos服务的IP地址:8848
    alicloud: #配置阿里云oss服务配置
      access-key: LTAI5tGopjcr41fSvUfZcEXV
      secret-key: xmQMsNwPCUwFRFdpt7FXaUKqy7psnX
      oss:
        endpoint: oss-cn-huhehaote.aliyuncs.com
  application: # 设置服务的名称----》nacos找到的就是我们服务的名称
    name: mall-third
server:
  port: 8090

bootstrap.properties

spring.application.name=mall-third
spring.cloud.nacos.config.server-addr=Nacos服务IP地址:8848

注意在启动类中别忘了放开注册中心

在这里插入图片描述

测试图片上传的代码直接拷贝即可

在这里插入图片描述

阿里云OSS服务查看
在这里插入图片描述

四.服务端生成签名实战

对象存储 OSS->最佳实践->网站与移动应用->Web端上传数据至OSS–>服务端签名后直传->指导手册

在这里插入图片描述

Java语言阿里云官方指导手册

@RestController
public class OSSController {

    @Autowired
    private OSS ossClient;

    @Value("${spring.cloud.alicloud.oss.endpoint}")
    private String endpoint;
    @Value("${spring.cloud.alicloud.oss.bucket}")
    private String bucket;
    @Value("${spring.cloud.alicloud.access-key}")
    private String accessId;

    @RequestMapping("/oss/policy")
    public Map<String, String> getOssPolicy(){

        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实例。
        //OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);
        Map<String, String> respMap = null;
        try {
            long expireTime = 30;
            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
            Date expiration = new Date(expireEndTime);
            // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
            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", 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());
        } finally {
            ossClient.shutdown();
        }
        return respMap;
    }
}

相关的属性配置

# 数据库的连接新
spring:
  cloud: # 配置nacos的地址
    nacos:
      discovery:
        server-addr: Nacos服务的IP地址:8848
    alicloud: #配置阿里云oss服务配置
      access-key: LTAI5tGopjcr41fSvUfZcEXV
      secret-key: xmQMsNwPCUwFRFdpt7FXaUKqy7psnX
      oss:
        endpoint: oss-cn-huhehaote.aliyuncs.com
        bucket: ljw-mall
  application: # 设置服务的名称----》nacos找到的就是我们服务的名称
    name: mall-third
server:
  port: 8090

访问即可:http://localhost:8090/oss/policy

在这里插入图片描述

客户端获取服务签名的时候肯定是走的网关路由,所以我们还需要在网关中添加Third服务的路由:

在这里插入图片描述

启动网关模块,然后通过网关调用获取服务签名:http://localhost:8070/app/third/oss/policy

在这里插入图片描述

好了,关于【25-业务开发-基础业务-品牌管理-图片管理-图片上传方式的三种实现方式-第三方公共服务模块集成到项目中-服务端生成签名实战】就先学习到这里,更多内容,持续学习创作中。

STM32电机库无感代码注释无传感器版本龙贝格观测三电阻双AD采样前馈控制弱磁控制斜坡启动内容概要:本文档为一份关于STM32电机控制的无传感器版本代码注释资源,聚焦于龙贝格观测器在永磁同步电机(PMSM)无感控制中的应用。内容涵盖三电阻双通道AD采样技术、前馈控制、弱磁控制及斜坡启动等关键控制策略的实现方法,旨在通过详细的代码解析帮助开发者深入理解基于STM32平台的高性能电机控制算法设计与工程实现。文档适用于从事电机控制开发的技术人员,重点解析了无位置传感器控制下的转子初始定位、速度估算与系统稳定性优化等问题。; 适合人群:具备一定嵌入式开发基础,熟悉STM32平台及电机控制原理的工程师或研究人员,尤其适合从事无感FOC开发的中高级技术人员。; 使用场景及目标:①掌握龙贝格观测器在PMSM无感控制中的建模与实现;②理解三电阻采样与双AD同步采集的硬件匹配与软件处理机制;③实现前馈补偿提升动态响应、弱磁扩速控制策略以及平稳斜坡启动过程;④为实际项目中调试和优化无感FOC系统提供代码参考和技术支持; 阅读建议:建议结合STM32电机控制硬件平台进行代码对照阅读与实验验证,重点关注观测器设计、电流采样校准、PI参数整定及各控制模块之间的协同逻辑,建议配合示波器进行信号观测以加深对控制时序与性能表现的理解。
【复现】基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度研究”展开,通过Matlab代码实现对该优化算法的复现与应用。研究聚焦于微电网群在复杂运行环境下的经济调度问题,提出一种改进的秃鹰算法以提升传统优化算法在收敛速度、全局寻优能力和稳定性方面的不足。文中详细阐述了微电网群的系统架构、目标函数构建(如最小化运行成本、降低碳排放)、约束条件(功率平衡、设备出力限制等),并通过仿真实验验证了所提算法在优化调度方案上的有效性与优越性。该研究为微电网群的低碳、经济、高效运行提供了可行的技术路径和仿真支持。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的高校研究生、科研人员及从事微电网、智能优化算法应用的工程技术人员。; 使用场景及目标:①学习和掌握智能优化算法(特别是改进秃鹰算法)在电力系统经济调度中的建模与实现方法;②复现高水平学术论文中的优化模型与算法,用于科研验证或二次开发;③为微电网群的能量管理、低碳调度等课题提供算法参考和技术支撑。; 阅读建议:建议读者结合Matlab代码逐行理解算法实现细节,重点关注目标函数设计、约束处理机制及算法迭代流程。同时可对比其他智能算法(如遗传算法、粒子群算法)的优化效果,深入分析改进秃鹰算法的优势与适用边界。
内容概要:本文系统梳理了2025年新能源汽车领域的媒体传播格局与发稿策略,全面分析了央媒、新闻媒体、地方官媒及自媒体四类媒体平台的特征、价值与应用场景。重点阐述了央媒在品牌权威背书、信任构建和全国战略覆盖中的核心作用,地方官媒在区域化传播与GEO优化中的精准优势,垂直媒体在技术解析与用户决策支持中的专业价值,以及自媒体在口碑传播、社交扩散和用户互动中的强大影响力。同时提出了分层媒体矩阵构建、差异化内容策略、协同传播节奏与数据驱动ROI优化等实战方法,并对未来智能化、个性化、全球化传播趋势作出前瞻性研判。; 适合人群:新能源汽车企业市场与品牌管理人员、公关传播从业者、数字营销负责人及媒体策略制定者。; 使用场景及目标:①制定品牌全域媒体传播策略,提升品牌权威性与市场影响力;②优化区域化营销布局,实现精准触达与高效转化;③构建自媒体矩阵与KOL合作体系,强化口碑传播与用户粘性;④科学评估媒体投放效果,提升传播ROI。; 阅读建议:本白皮书兼具战略高度与执行细节,建议结合企业所处发展阶段(初创期/成长期/成熟期)对照媒体资源分配建议,将央媒背书、地方渗透、垂直影响与社交引爆有机结合,形成协同传播闭环,并持续通过数据反馈优化内容形式与投放策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值