码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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,并测试即可

    
    <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.0modelVersion>
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.4.12version>
            <relativePath/> 
        parent>
        <groupId>com.ljw.mallgroupId>
        <artifactId>mall-third-partyartifactId>
        <version>0.0.1-SNAPSHOTversion>
        <name>mall-third-partyname>
        <description>第三方服务description>
        <properties>
            <java.version>1.8java.version>
            <spring-cloud.version>2020.0.1spring-cloud.version>
        properties>
        <dependencies>
            <dependency>
                <groupId>com.ljw.mallgroupId>
                <artifactId>mall-commonsartifactId>
                <version>0.0.1-SNAPSHOTversion>
                 
                <exclusions>
                    <exclusion>
                        <groupId>com.baomidougroupId>
                        <artifactId>mybatis-plus-boot-starterartifactId>
                    exclusion>
                exclusions>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alicloud-ossartifactId>
                <version>2.1.0.RELEASEversion>
            dependency>
        dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloudgroupId>
                    <artifactId>spring-cloud-dependenciesartifactId>
                    <version>${spring-cloud.version}version>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
            dependencies>
        dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                plugin>
            plugins>
        build>
    
    project>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    属性文件: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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    bootstrap.properties

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

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

    在这里插入图片描述

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

    在这里插入图片描述

    阿里云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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    相关的属性配置

    # 数据库的连接新
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

  • 相关阅读:
    Failure [DELETE_FAILED_INTERNAL_ERROR]的解决办法
    虚拟内存相关笔记
    前端HTML5 +CSS3 5.CSS布局 4 浮动
    R-CNN、Fast RCNN和Faster RCNN的详细讲解
    【COSBench系列】1. COSBench认识、使用、结果分析
    劝你不要转行
    解决QT的无界面程序,Ctrl+C无法触发析构函数的问题
    使用Cent Browser+Aria2+Bilibili Envolved下载b站视频--保姆级安装步骤
    基于nodejs+vue的读书会网站
    SpringCloud——负载均衡Ribbon
  • 原文地址:https://blog.csdn.net/Coder_ljw/article/details/127953243
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号