45、springboot 文件上传到指定磁盘路径 及 上传成功后的文件回显

news2024/11/19 5:47:13

需求:
写一个文件上传的功能,把文件上传到指定的文件夹。
然后上传成功后的文件回显

★ Spring Boot对文件上传提供的自动配置支持

Spring Boot的文件上传自动配置主要由 MultipartAutoConfiguration 和 MultipartProperties 两个类组成。

MultipartProperties负责加载 spring.servlet.multipart.* 开头的配置属性。

MultipartAutoConfiguration 则根据 MultipartProperties 读取的配置属性来初始化
StandardServletMultipartResolver 解析器对象。

MultipartAutoConfiguration:处理文件上传的类。
MultipartProperties :属性处理类,用来读取配置文件中的 spring.servlet.multipart.* 开头的配置属性

★ 文件上传的相关配置属性,由MultipartProperties类提供支持

# 设置每个文件上传域的最大大小
spring.servlet.multipart.max-file-size=10MB
# 设置整个请求支持的最大大小
spring.servlet.multipart.max-request-size=50MB
# 设置文件上传的中转目录
spring.servlet.multipart.location=d:/temp

★ 文件上传的步骤

(1)前端页面的文件请求以“multipart/form-data”编码方式提交请求。

(2)定义MultipartFile类型的属性用于封装文件上传域。

(3)通过MultipartFile属性即可访问被上传的文件,可以将该文件写入任意目录(或数据库)

▲ 希望看到文件上传回显

 能看到上传后文件的图片,

 (1)需要将服务器保存文件的所使用的文件名传回给视图页面。

 (2)还需要将保存文件的路径设置为Spring Boot的静态资源路径。
      添加额外的静态资源路径时,额外添加的磁盘最后必须要有一个斜杠结尾

文件上传:代码演示:

要上传文件的页面好看一些,需要这么一个文件上传控件。添加这个文件上传的界面组件。
在这里插入图片描述

问题:为什么这里选择了文件,但是却没有显示文件名
在这里插入图片描述
解决:
因为js文件是从上往下执行的。
在这里插入图片描述
效果:
选择文件后,成功显示文件名,为何能成功,就是通过 bsCustomFileInput.init(); ,让整个页面加载完之后,再初始化这个 custom-file-input 组件。让其能成功生效显示文件名。
在这里插入图片描述

方法参数介绍:
在这里插入图片描述
如果请求参数过多,不可能一个一个写,所以直接把请求参数封装成一个对象就行
在这里插入图片描述

完整代码

添加文件的页面:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
    <!--  引入css样式,用 link 元素  ,  stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
    <!--  引入 Bootstrap 的 Web Jar 中的 CSS 样式  -->
    <link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">
    <!--  jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery  -->
    <!--  引入 jQuery 的 Web Jar 中的 js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>
    <!--  引入 Bootstrap 的 Web Jar 中的 js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>
    <!--  引入 popper 的 Web Jar 中的 Js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>
    <!--  引入文件上传的界面组件的js  -->
    <script type="text/javascript"
            th:src="@{'/webjars/bs-custom-file-input/dist/bs-custom-file-input.js'}"></script>
    <script>
        // <!-- 当整个页面加载完成的时候,就执行这个函数,保证这个函数是在页面加载完成后才执行初始化 -->
        // <!-- 初始化 custom file input 组件的 JS 脚本 -->
        $(function () {
            bsCustomFileInput.init();
        })
    </script>
</head>
<body>
<div class="container">
    <h4>添加图书</h4>
    <!-- 保证请求是以 multipart/form-data 格式提交请求
     不用这个格式,文件上传的数据都不会传到服务器 -->
    <form method="post" th:action="@{/addBookFile}" enctype="multipart/form-data">
        <div class="form-group row">
            <label for="name" class="col-sm-2 col-form-label">图书名:</label>
            <div class="col-sm-7">
                <input type="text" id="name" name="name"
                       class="form-control" placeholder="请输入图书名">
            </div>
            <div class="col-sm-3 text-danger">
                <span th:if="${book != null}" th:errors="${book.name}">错误提示</span>
            </div>
        </div>
        <div class="form-group row">
            <label for="cover" class="col-sm-2 col-form-label">图书封面:</label>
            <div class="col-sm-7">
                <!--  custom-file 用来保证页面比较好看  -->
                <div class="custom-file">
                    <input type="file" id="cover" name="cover"
                           class="custom-file-input">
                    <label class="custom-file-label" for="cover">选择文件</label>
                </div>
            </div>
            <div class="col-sm-3 text-danger">
                <span th:if="${book != null}" th:errors="${book.cover}">错误提示</span>
            </div>
        </div>
        <div class="form-group row">
            <div class="col-sm-6 text-right">
                <button type="submit" class="btn btn-primary">添加</button>
            </div>
            <div class="col-sm-6">
                <button type="reset" class="btn btn-danger">重设</button>
            </div>
        </div>
    </form>
</div>

</body>
</html>

配置文件:
设置上传文件的目录
在这里插入图片描述

创建一个Book对象用来封装前端传来的文件的数据。
在这里插入图片描述

后端业务逻辑代码:

package cn.ljh.file_upload.controller;

import cn.ljh.file_upload.domain.Book;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.UUID;

@Controller
public class FileUpLoadController {

    //指定文件上传的存储路径,把路径写在配置文件中,通过 @Value 注解来获取该属性值
    @Value("${ljh.myfile.savePath}")
    private String destPath;

    @SneakyThrows
    @PostMapping("/addBookFile")
    public String addBookFile(Book book, Model model){
        //处理文件上传逻辑:也就是把文件内容保存到服务器的指定路径下。

        //创建文件
        File file = new File(destPath);
        //判断文件是否存在
        if (!file.exists()){
            //如果没有该文件,也就是该目录不存在,则创建该目录
            file.mkdir();
        }
        /*
         * destFile 是服务器端重新生成的一个文件名,而且保留了原来的拓展名。
         * 比如 我们上传文件的拓展名是 .jpg , 服务器生成的这个 destFile 文件,
         * 不仅要有上传的文件的内容,拓展名(后缀名)也要保持一致
         * Extension: 扩展    Original:起初的、原先的
         */

        //获取上传文件的原拓展名

        //获取上传文件的文件名
        String originalFilename = book.getCover().getOriginalFilename();
        //通过String工具类来获取这个文件名的扩展名
        String ext = StringUtils.getFilenameExtension(originalFilename);

        /*
         *   destPath + "/"  : 指定文件上传的路径 ,路径和文件名之间需要加一个斜杠 /
         *   UUID.randomUUID().toString() : 生成文件名
         *   "." + ext : 文件的扩展名(后缀名)
         */
        //生成一个新的文件
        File destFile = new File(destPath + "/" + UUID.randomUUID().toString() + "." + ext);
        
        //获取要上传文件的内容,返回是MultipartFile对象
        MultipartFile cover = book.getCover();
        //MultipartFile对象有一个方法 transferTo :可以将上传文件的内容写入到指定的文件destFile中。
        cover.transferTo(destFile);

        model.addAttribute("tip" , originalFilename + "文件上传成功!");
        
        return "uploadfile_success";
    }
}

简单的上传文件后的返回页面:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>上传成功</title>
    <!--  引入css样式,用 link 元素  ,  stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
    <!--  引入 Bootstrap 的 Web Jar 中的 CSS 样式  -->
    <link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">
    <!--  jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery  -->
    <!--  引入 jQuery 的 Web Jar 中的 js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>
    <!--  引入 Bootstrap 的 Web Jar 中的 js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>
    <!--  引入 popper 的 Web Jar 中的 Js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>

</head>
<body>
<div class="container">
    <h4>文件上传成功</h4>
    <div class="text-primary" th:text="${tip}">提示</div>
</div>

</body>
</html>

效果:

在这里插入图片描述

文件回显

▲ 希望看到文件上传回显

 能看到上传后文件的图片,

 (1)需要将服务器保存文件的所使用的文件名传回给视图页面。

 (2)还需要将保存文件的路径设置为Spring Boot的静态资源路径。
      添加额外的静态资源路径时,额外添加的磁盘最后必须要有一个斜杠结尾

代码演示:

没能成功回显图片,待后续研究。

封装参数的对象添加个 fileName 属性,用来返回上传之后的文件面
在这里插入图片描述

把文件名单独拎出来,设置到book对象里面
在这里插入图片描述

弄一个配置类,用于添加额外的静态资源路径,把图片的磁盘路径映射到静态资源路径里面,让项目可以读取到从而进行回显。
在这里插入图片描述
文件上传后的页面,回显的代码只有这么一句。
在这里插入图片描述

配置的磁盘路径,需要在最后加一条斜杠
在这里插入图片描述

结果:
没弄出来。
在这里插入图片描述

全部代码:

最终加上回显的代码(没回显成功,待后续研究)

index

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
    <!--  引入css样式,用 link 元素  ,  stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
    <!--  引入 Bootstrap 的 Web Jar 中的 CSS 样式  -->
    <link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">
    <!--  jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery  -->
    <!--  引入 jQuery 的 Web Jar 中的 js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>
    <!--  引入 Bootstrap 的 Web Jar 中的 js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>
    <!--  引入 popper 的 Web Jar 中的 Js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>
    <!--  引入文件上传的界面组件的js  -->
    <script type="text/javascript"
            th:src="@{'/webjars/bs-custom-file-input/dist/bs-custom-file-input.js'}"></script>
    <script>
        // <!-- 当整个页面加载完成的时候,就执行这个函数,保证这个函数是在页面加载完成后才执行初始化 -->
        // <!-- 初始化 custom file input 组件的 JS 脚本 -->
        $(function () {
            bsCustomFileInput.init();
        })
    </script>
</head>
<body>
<div class="container">
    <h4>添加图书</h4>
    <!-- 保证请求是以 multipart/form-data 格式提交请求
     不用这个格式,文件上传的数据都不会传到服务器 -->
    <form method="post" th:action="@{/addBookFile}" enctype="multipart/form-data">
        <div class="form-group row">
            <label for="name" class="col-sm-2 col-form-label">图书名:</label>
            <div class="col-sm-7">
                <input type="text" id="name" name="name"
                       class="form-control" placeholder="请输入图书名">
            </div>
            <div class="col-sm-3 text-danger">
                <span th:if="${book != null}" th:errors="${book.name}">错误提示</span>
            </div>
        </div>
        <div class="form-group row">
            <label for="cover" class="col-sm-2 col-form-label">图书封面:</label>
            <div class="col-sm-7">
                <!--  custom-file 用来保证页面比较好看  -->
                <div class="custom-file">
                    <input type="file" id="cover" name="cover"
                           class="custom-file-input">
                    <label class="custom-file-label" for="cover">选择文件</label>
                </div>
            </div>
            <div class="col-sm-3 text-danger">
                <span th:if="${book != null}" th:errors="${book.cover}">错误提示</span>
            </div>
        </div>
        <div class="form-group row">
            <div class="col-sm-6 text-right">
                <button type="submit" class="btn btn-primary">添加</button>
            </div>
            <div class="col-sm-6">
                <button type="reset" class="btn btn-danger">重设</button>
            </div>
        </div>
    </form>
</div>

</body>
</html>

uploadfile_success.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>上传成功</title>
    <!--  引入css样式,用 link 元素  ,  stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
    <!--  引入 Bootstrap 的 Web Jar 中的 CSS 样式  -->
    <link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">
    <!--  jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery  -->
    <!--  引入 jQuery 的 Web Jar 中的 js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>
    <!--  引入 Bootstrap 的 Web Jar 中的 js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>
    <!--  引入 popper 的 Web Jar 中的 Js 脚本  -->
    <script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>

</head>
<body>
<div class="container">
    <h4>文件上传成功</h4>
    <div class="text-primary" th:text="${tip}">提示</div>

    <!--  文件上传后进行回显  -->
    <img th:src="@{'/uploads/' + ${book.fileName}}">

</div>

</body>
</html>

Book

package cn.ljh.file_upload.domain;

import lombok.Data;
import org.springframework.web.multipart.MultipartFile;

@Data
public class Book {

    private Integer id;
    private String name;
    //用来封装前端传来的文件数据
    private MultipartFile cover;

    //用于封装上传之后的文件名
    private String fileName;
    
}

FileUpLoadController

package cn.ljh.file_upload.controller;

import cn.ljh.file_upload.domain.Book;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.UUID;

@Controller
public class FileUpLoadController {

    //指定文件上传的存储路径,把路径写在配置文件中,通过 @Value 注解来获取该属性值
    @Value("${ljh.myfile.savePath}")
    private String destPath;

    @SneakyThrows
    @PostMapping("/addBookFile")
    public String addBookFile(Book book, Model model){
        //处理文件上传逻辑:也就是把文件内容保存到服务器的指定路径下。

        //创建文件
        File file = new File(destPath);
        //判断文件是否存在
        if (!file.exists()){
            //如果没有该文件,也就是该目录不存在,则创建该目录
            file.mkdir();
        }
        /*
         * destFile 是服务器端重新生成的一个文件名,而且保留了原来的拓展名。
         * 比如 我们上传文件的拓展名是 .jpg , 服务器生成的这个 destFile 文件,
         * 不仅要有上传的文件的内容,拓展名(后缀名)也要保持一致
         * Extension: 扩展    Original:起初的、原先的
         */

        //获取上传文件的原拓展名

        //获取上传文件的文件名
        String originalFilename = book.getCover().getOriginalFilename();
        //通过String工具类来获取这个文件名的扩展名
        String ext = StringUtils.getFilenameExtension(originalFilename);

        /*
         *   destPath + "/"  : 指定文件上传的路径 ,路径和文件名之间需要加一个斜杠 /
         *   UUID.randomUUID().toString() : 生成文件名
         *   "." + ext : 文件的扩展名(后缀名)
         */
        //生成一个新的文件

        //生成文件名
        String fileName = UUID.randomUUID().toString() + "." + ext;

        File destFile = new File(destPath + "/" + fileName);

        //获取要上传文件的内容,返回是MultipartFile对象
        MultipartFile cover = book.getCover();
        //MultipartFile对象有一个方法 transferTo :可以将上传文件的内容写入到指定的文件destFile中。
        cover.transferTo(destFile);

        //文件上传成功后回显的名字
        book.setFileName(fileName);

        model.addAttribute("tip" , originalFilename + "文件上传成功!");

        return "uploadfile_success";
    }
}

FileUpLoadConfig

package cn.ljh.file_upload.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//用于文件上传成功后的回显的处理类
@Configuration
public class FileUpLoadConfig implements WebMvcConfigurer {

    //指定文件上传的存储路径,把路径写在配置文件中,通过 @Value 注解来获取该属性值
    @Value("${ljh.myfile.savePath}")
    private String destPath;

    //重写这个方法,用于添加额外的静态资源路径
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        //将文件上传的destPath这个磁盘路径添加成静态资源路径,并映射到 /uploads/** 路径下。
        registry.addResourceHandler("/uploads/**")
                .addResourceLocations(destPath);
    }
}

application.yml

#指定文件上传后保存的路径
ljh:
  myfile:
    savePath: F:\myCode\crazyCode\SpringBoot\springboot07\uploads\


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux并发服务器 —— 多线程并发(六)

线程概述 同一个程序中的所有线程均会独立执行相同程序&#xff0c;且共享同一份全局内存区域&#xff1b; 进程是CPU分配资源的最小单位&#xff0c;线程是操作系统调度执行的最小单位&#xff1b; Linux环境下&#xff0c;线程的本质就是进程&#xff1b; ps -Lf pid&…

【方案】基于视频与AI智能分析技术的城市轨道交通视频监控建设方案

一、背景分析 地铁作为重要的公共场所交通枢纽&#xff0c;流动性非常高、人员大量聚集&#xff0c;轨道交通需要利用视频监控系统来实现全程、全方位的安全防范&#xff0c;这也是保证地铁行车组织和安全的重要手段。调度员和车站值班员通过系统监管列车运行、客流情况、变电…

MySQL数据库——多表查询(3)-自连接、联合查询、子查询

目录 自连接 查询语法 自连接演示 联合查询 查询语法 子查询 介绍 标量子查询 列子查询 行子查询 表子查询 自连接 通过前面的学习&#xff0c;我们对于连接已经有了一定的理解。而自连接&#xff0c;通俗地去理解就是自己连接自己&#xff0c;即一张表查询多次。…

Python小知识 - 一致性哈希算法

一致性哈希算法 一致性哈希算法&#xff08;Consistent Hashing Algorithm&#xff09;是用于解决分布式系统中节点增减比较频繁的问题。它的思想是&#xff0c;将数据映射到0~2^64-1的哈希空间中&#xff0c;并通过哈希函数对数据进行映射&#xff0c;计算出数据所在的节点。当…

【LeetCode75】第四十三题 钥匙和房间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个数组&#xff0c;表示对应的房间里拥有能开启的对应索引号的钥匙。 一开始我们只能进入0号房间&#xff0c;也就是数组里索引…

图像OCR转文字,验证码识别技术太疯狂-UI软件自动化

现在用PYTHON识别图片文字&#xff0c;PaddleOCR&#xff0c;Tesseract,Opencv等很多开源技术。知识大爆炸年代&#xff0c;几年不学习就跟不上时代了。 以前早的时候一个验证码图片上有4个不同颜色字符&#xff0c;带一些杂点&#xff0c;我写点代码按颜色最多的进行提取&…

Angular安全专辑之三 —— 授权绕过,利用漏洞控制管理员账户

这篇文章是针对实际项目中所出现的问题所做的一个总结。简单来说&#xff0c;就是授权绕过问题&#xff0c;管理员帐户被错误的接管。 详细情况是这样的&#xff0c;我们的项目中通常都会有用户身份验证功能&#xff0c;不同的用户拥有不同的权限。相对来说管理员账户所对应的…

Al智能问答工具HelpLook招募推荐官啦!

我们在使用AI智能问答软件的时候&#xff0c;可以多去留意一下软件的一些推广活动&#xff0c;比如说像是HelpLook这个软件&#xff0c;他有专门设置推广返利计划&#xff0c;在拉动更多新用户的同时做到回馈老用户。今天looklook就来讲一下&#xff0c;具体这个计划是怎么样的…

11 mysql float/double/decimal 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 float, decimal 类类型的相关数据…

如何在 Vue TypeScript 项目使用 emits 事件

Vue是构建出色的Web应用程序的最灵活、灵活和强大的JavaScript框架之一。Vue中最重要的概念和关键特性之一是能够促进应用程序组件之间的通信。让我们深入探讨一下Vue中的“emits”概念&#xff0c;并了解它们如何以流畅和无缝的方式实现父子组件之间的通信。 Vue中的emits是什…

layui 新增tab标签页

// $("#fjyj").click(function () {// //window.location.href "/sysconfig/SuperVisorEdit";// navigateToTeamPersonModule(/CollectData/GradeWarning/EduIndex, 分级预警);// });function navigateToTeamPersonModule(url, name) {var ids n…

前几天写的博客被选中进入【CSDN月度精选】榜单

小收获&#xff0c;记录一下&#xff0c;哈哈 这个貌似是CSDN给的排名和得分&#xff1a;

AI人员打闹监测识别算法

AI人员打闹监测识别算法通过yolopython网络模型框架算法&#xff0c; AI人员打闹监测识别算法能够准确判断出是否有人员进行打闹行为&#xff0c;算法会立即发出预警信号。Yolo算法&#xff0c;其全称是You Only Look Once: Unified, Real-Time Object Detection&#xff0c;其…

ArcGIS美化科研论文地图(利用在线底图)

1.加载在线底图服务 在ArcGIS Desktop中打开Catalog窗口&#xff0c;在GIS Servers中点击Add ArcGIS Server&#xff0c;之后选项全部默认&#xff0c;仅在URL中输入以下网址https://services.arcgisonline.com/arcgis 之后就可以看到底图了 我们在WorldElevation3D中选择Nat…

Php“梦寻”淘宝天猫商品详情数据接口,淘宝商品详情数据API接口,淘宝API接口申请指南(含代码示例)

淘宝商品详情接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取淘宝商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在淘宝电商平台的开发中&#xff0c;淘宝详情接口 API 是非常常用的 API&#xff0c;因此本文将详细介绍淘宝详情接口 …

sentinel熔断报java.lang.reflect.UndeclaredThrowableException

背景&#xff1a;内部要进行应用jdk&springboot升级&#xff0c;因此也需要将Spring Cloud Hystrix 替换成alibaba sentinel。 依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</a…

Spring Boot源码解读与原理剖析:深入探索Java开发的奥秘!

评论区留言赠书15本 关注点赞评论&#xff0c;评论区回复“Spring Boot源码解读与原理剖析&#xff1a;深入探索Java开发的奥秘&#xff01;” 每篇最多评论3条&#xff01;&#xff01;采用抽奖助手自动拉取评论区有效评论送书两本&#xff0c; 开奖时间&#xff1a;9月11号 承…

经济2023---风口

改革开放以来&#xff0c;中国共有12次比较好的阶级跃迁的机会&#xff1a; 包括80年代选部委院校、办乡镇企业、倒卖商品&#xff1b;90年代下海、选外语外贸、炒股&#xff1b;00年代从事资源品行业、选金融、炒房&#xff1b;10年代选计算机、搞互联网、买比特币。 从这里…