SpringBoot(文件上传功能,阿里云OSS存储,几种配置文件用法)【详解】

目录

一、新增员工

二、文件上传-技术点

1. 文件上传功能

1.客户端上传文件三要素

2 服务端接收文件

Controller接收文件示例

修改允许上传的文件大小

2. 本地存储文件

3. 阿里云OSS存储(这里只写一种,可以用其它的)

1.介绍

2.开通阿里云OSS服务

3.阿里云OSS使用示例

4. 上传员工头像

三、修改员工

1. 查询

2. 修改

四、配置文件

1. SpringBoot的配置文件

1.SpringBoot支持的配置文件格式

2 properties文件

方式1:@Value方式

方式2:@ConfigurationProperties方式

3 yaml文件

yaml基本语法

yaml高级语法

yaml使用示例

读取yaml里的配置参数

2. 阿里云OSS配置的配置与读取

把配置参数提取到yml文件里

修改工具类读取配置参数


一、新增员工

输入员工信息(暂不考虑头像),点击“保存”按钮时,要提交到服务端,把员工信息保存到数据库

分析:

EmpController:

@PostMapping
public Result addEmp(@RequestBody Emp emp){
    empService.addEmp(emp);
    return Result.success();
}

EmpService:

void addEmp(Emp emp);

EmpServiceImpl:

@Override
public void addEmp(Emp emp) {
    emp.setCreateTime(LocalDateTime.now());
    emp.setUpdateTime(LocalDateTime.now());
    empMapper.insert(emp);
}

EmpMapper:

@Insert("INSERT INTO emp (username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
        "VALUES (#{username}, #{password}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
void insert(Emp emp);

二、文件上传-技术点

1. 文件上传功能

文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程

文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能

1.客户端上传文件三要素

客户端要把文件上传到服务端,需要满足以下三要素,否则仅仅是提交文件名,而不会提交文件内容:

  • 使用表单方式提交,且表单提交方式是POST

  • 表单的enctype属性要设置为multipart/form-data

  • 表单里要有文件选择框,且文件选择框必须有name属性:<input type="file" name="表单参数名">

示例:在工程的resources下的static目录里创建文件demo.html,内容如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传-示例</title>
</head>
<body>
    <!-- 
		1. 使用表单方式提交数据,且表单提交方式为post 
		2. 表单form标签的enctype属性要设置为multipart/form-data
	-->
    <form action="/file/upload" method="post" enctype="multipart/form-data">
        <input type="text" name="name"><br>
        <!-- 3. 表单里要有文件选择框,且必须有name属性 -->
        <input type="file" name="avatar"><br>
        <button>提交</button>
    </form>
</body>
</html>

2 服务端接收文件

在Controller里接收文件数据:

  • 需要使用MultipartFile类型的参数,MultipartFile对象的常用方法:

    • getOriginalFilename():获取原始文件名(客户端上传的文件名称)

    • getSize():获取文件的大小,单位是byte字节

    • getInputStream():获取字节输入流对象,用于获取文件数据

    • transferTo(File dest):把文件数据存储到本地磁盘上

  • 默认允许上传的文件大小为1M,可以通过修改配置文件来调整限制

Controller接收文件示例

服务端接收文件,代码示例:

package com.itheima.controller;

import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * @author liuyp
 * @since 2023/08/21
 */
@Slf4j
@RestController
@RequestMapping("/file")
public class FileController {

    /**
     * 客户端提交了表单数据,一个是name,一个是avatar
     * 在方法上直接加形参,可以接收表单数据:
     * 		name是字符串,使用String类型
     *		avatar是文件,使用MultipartFile类型
     */
    @PostMapping("/upload")
    public Result upload(String name, MultipartFile avatar){

        return Result.success();
    }
}

修改允许上传的文件大小

修改配置文件application.properties或者yaml或yml

#设置:一次请求最大允许提交20MB。默认10MB
spring.servlet.multipart.max-request-size=20MB
#设置:一个文件最大允许10MB。默认1MB
spring.servlet.multipart.max-file-size=10MB

2. 本地存储文件

所谓本地存储文件,是客户端把文件上传到服务器之后,服务器把文件直接存储到自己的磁盘里。

好处:简单

缺点:

  • 本地磁盘空间有限,不能存储太多文件;且不方便扩容

  • 本地存储文件,没有备份,一旦磁盘出现问题,就会丢失文件

  • 维护管理不方便

示例代码:

@Slf4j
@RestController
@RequestMapping("/file")
public class FileController {

    @PostMapping("/upload")
    public Result upload(String name, MultipartFile avatar) throws IOException {
        log.info("name={}", name);
        //重命名文件
        //	1. 获取原始文件名。比如:100.jpg
        String filename = avatar.getOriginalFilename();
        //	2. 截取得到后缀名。比如:.jpg
        String suffix = filename.substring(filename.lastIndexOf("."));
        //	3. 重新生成新的文件名。比如:2ceea81e-2a4d-4709-8332-367ea4e34e23.jpg
        filename = UUID.randomUUID().toString() + suffix;
        //保存文件到本地磁盘
        avatar.transferTo(Paths.get("E:\\" + filename));
        log.info("文件已保存到:E:/{}", filename);
        return Result.success();
    }
}

3. 阿里云OSS存储(这里只写一种,可以用其它的)

1.介绍

阿里云对象存储 OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供最高可达 99.995 % 的服务可用性。多种存储类型供选择,全面优化存储成本。

2.开通阿里云OSS服务

(1)打开https://www.aliyun.com/ ,申请阿里云账号并完成实名认证。

(2)充值 (可以不用做)

(3)开通OSS

登录阿里云官网。 点击右上角的控制台。

将鼠标移至产品,找到并单击对象存储OSS,打开OSS产品详情页面。在OSS产品详情页中的单击立即开通。

开通服务后,在OSS产品详情页面单击管理控制台直接进入OSS管理控制台界面。您也可以单击位于官网首页右上方菜单栏的控制台,进入阿里云管理控制台首页,然后单击左侧的对象存储OSS菜单进入OSS管理控制台界面。

(4)创建存储空间

新建Bucket,命名为 hmleadnews ,读写权限为 ==公共读==(不然别人没办法上传)

3. OSS快速入门

(1)创建测试工程,引入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>

(2)新建类和main方法

import org.junit.jupiter.api.Test;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import java.io.FileInputStream;
import java.io.InputStream;

public class AliOssTest {

    @Test
    public void testOss(){
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "---------------------";
        String accessKeySecret = "-----------------------";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "-----------";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "0001.jpg";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath= "C:\\Users\\Administrator\\Pictures\\Saved Pictures\\10.jpg";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (Exception ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

4. 获取AccessKeyId

3.阿里云OSS使用示例

阿里云OSS文档:OSS Java SDK 兼容性和示例代码_对象存储(OSS)-阿里云帮助中心

阿里云SDK介绍:安装OSS Java SDK_对象存储(OSS)-阿里云帮助中心

上传文件示例代码:如何使用JavaSDK简单上传文件_对象存储(OSS)-阿里云帮助中心

4. 上传员工头像

  1. 在类上添加@Component

  2. 修改配置参数endpoind、accessKeyId、accessKeySecret、bucket名称等,改成自己的

如果要上传文件时:

  • 只要使用@Autowired注入AliOSSUtils对象,调用它的upload方法就可以了

工具类:

package com.itheima.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Component
public class AliOSSUtils {

    @Value("${aliyun.endpoint}")
    private String endpoint;
    @Value("${aliyun.accessKeyId}")
    private String accessKeyId;
    @Value("${aliyun.accessKeySecret}")
    private String accessKeySecret;
    @Value("${aliyun.bucketName}")
    private String bucketName;

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }
}

controller:

package com.itheima.controller;

import com.itheima.pojo.Result;
import com.itheima.util.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;


@Slf4j
@RestController
public class UploadController {
    @Autowired
    private AliOSSUtils ossUtils;

    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
        String url = ossUtils.upload(image);
        return Result.success(url);
    }
}

三、修改员工

1. 查询

EmpController:

@GetMapping("/{id}")
public Result queryEmpById(@PathVariable("id") Integer id){
    Emp emp = empService.queryEmpById(id);
    return Result.success(emp);
}

EmpService:

Emp queryEmpById(Integer id);

EmpServiceImpl:

@Override
public Emp queryEmpById(Integer id) {
    return empMapper.selectById(id);
}

EmpMapper:

@Select("select * from emp where id = #{id}")
Emp selectById(Integer id);

2. 修改

EmpController:

@PutMapping
public Result updateEmp(@RequestBody Emp emp){
    empService.updateEmpById(emp);
    return Result.success();
}

EmpService:

void updateEmpById(Emp emp);

EmpServiceImpl:

@Override
public void updateEmpById(Emp emp) {
    empMapper.updateById(emp);
}

EmpMapper:

void updateById(Emp emp);

EmpMapper.xml:

<update id="updateById">
    UPDATE emp
    <set>
        <if test="username!=null and username.length()>0">username = #{username},</if>
        <if test="password!=null and password.length()>0">password = #{password},</if>
        <if test="name!=null and name.length()>0">name = #{name},</if>
        <if test="gender!=null">gender = #{gender},</if>
        <if test="image!=null and image.length()>0">image = #{image},</if>
        <if test="job!=null">job = #{job},</if>
        <if test="entrydate!=null">entrydate = #{entrydate},</if>
        <if test="deptId!=null">dept_id = #{deptId},</if>
        <if test="updateTime!=null">update_time = #{updateTime}</if>
    </set>
    WHERE id = #{id};
</update>

四、配置文件

1. SpringBoot的配置文件

1.SpringBoot支持的配置文件格式

SpringBoot工程支持的配置文件格式有:

  • application.properties

    优点:格式简单,key=value,所有配置参数都是平级的关系

    缺点:不方便表示不同层级的配置参数

  • application.yml或者application.yaml

    优点:格式简单,key: value,还能表示配置参数之间的层级

无论是哪种配置文件,都可以用于配置参数。包括SpringBoot本身的参数,或者是自定义的参数。而SpringBoot工程会自动读取配置文件,我们可以直接获取配置文件里的参数值

2 properties文件

使用properties配置参数

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#0000ff">aliyun.endpoint</span>=<span style="color:#009900">https</span>:<span style="color:#009900">//oss-cn-beijing.aliyuncs.com</span>
<span style="color:#0000ff">aliyun.accessKeyId</span>=<span style="color:#009900">LTAI5tG3TbA9HLs22KEtimyB</span>
<span style="color:#0000ff">aliyun.accessKeySecret</span>=<span style="color:#009900">4avUxhaO5KCTl5pqpta3AdU98mT9um</span>
<span style="color:#0000ff">aliyun.bucketName</span>=<span style="color:#009900">itheima-liuyp</span></span></span>

获取参数值

无论是在application.properties里,还是在application.yaml里配置了参数,如果我们的程序代码中需要获取这些参数该怎么做呢?

  • 首先:并不需要我们加载配置文件,SpringBoot会帮我们加载配置文件,把所有配置参数存储起来

  • 然后:我们需要什么参数,直接使用注解注入参数值即可。常用两种方式

    @Value方式

    @ConfigurationProperties方式

方式1:@Value方式

作用:在==任意bean对象==里,都可以使用@Value,注入某个参数值

用法:在bean对象里增加成员变量,在成员变量上增加注解@Value("${参数名}")

使用:如果只需要获取少量几个参数值,就使用@Value("${参数名}");如果要读取大量参数,建议使用方式2

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">controller</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">pojo</span>.<span style="color:#000000">Result</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">service</span>.<span style="color:#000000">EmpService</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">beans</span>.<span style="color:#000000">factory</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Autowired</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">beans</span>.<span style="color:#000000">factory</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Value</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">GetMapping</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">RestController</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* @author liuyp</span>
 <span style="color:#aa5500">* @since 2023/08/22</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@RestController</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">DemoConfigController</span> {
​
    <span style="color:#aa5500">/** 把“AA”直接注入赋值给变量aa */</span>
    <span style="color:#555555">@Value</span>(<span style="color:#aa1111">"AA"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">aa</span>;
​
    <span style="color:#aa5500">/** 取名称为“aliyun.endpoint”的参数值,注入赋值给当前成员变量endpoint */</span>
    <span style="color:#555555">@Value</span>(<span style="color:#aa1111">"${aliyun.endpoint}"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">endpoint</span>;
​
    <span style="color:#aa5500">/**取名称为“aliyun.accessKeyId”的参数值,注入赋值给当前成员变量*/</span>
    <span style="color:#555555">@Value</span>(<span style="color:#aa1111">"${aliyun.accessKeyId}"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">accessKey</span>;
​
    <span style="color:#555555">@GetMapping</span>(<span style="color:#aa1111">"/config1"</span>)
    <span style="color:#770088">public</span> <span style="color:#000000">Result</span> <span style="color:#000000">config1</span>(){
        <span style="color:#770088">return</span> <span style="color:#000000">Result</span>.<span style="color:#000000">success</span>(<span style="color:#000000">accessKey</span>);
    }
}</span></span>
方式2:@ConfigurationProperties方式

作用:读取一批配置参数,封装到一个JavaBean对象里。当需要使用参数值的时候,只要得到这个JavaBean对象即可

用法:

  1. 准备一个JavaBean类,用于封装一批参数值

    类上加@ConfigurationProperties + @Component

  2. 使用时用@Autowired注入这个JavaBean对象

优点:可以一次性读取一批配置参数值,使用时让代码更简洁

示例:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">pojo</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">lombok</span>.<span style="color:#000000">Data</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">context</span>.<span style="color:#000000">properties</span>.<span style="color:#000000">ConfigurationProperties</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">stereotype</span>.<span style="color:#000000">Component</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 1. 类里要有private成员变量,@Data提供get和set方法</span>
 <span style="color:#aa5500">* 2. 类上要加@ConfigurationProperties(prefix="配置参数名的前缀")</span>
 <span style="color:#aa5500">*    prefix + 成员变量名:要对应一个配置参数名</span>
 <span style="color:#aa5500">* 3. 类上加@Component,让Spring帮我们生成类的对象放到容器里</span>
 <span style="color:#aa5500">* @author liuyp</span>
 <span style="color:#aa5500">* @since 2023/08/22</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@Data</span>
<span style="color:#555555">@Component</span>
<span style="color:#555555">@ConfigurationProperties</span>(<span style="color:#000000">prefix</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"aliyun"</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">AliyunProperties</span> {
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">endpoint</span>;
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">accessKeyId</span>;
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">accessKeySecret</span>;
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">bucketName</span>;
}</span></span>

使用时:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">controller</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">pojo</span>.<span style="color:#000000">AliyunProperties</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">pojo</span>.<span style="color:#000000">Result</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">service</span>.<span style="color:#000000">EmpService</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">beans</span>.<span style="color:#000000">factory</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Autowired</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">beans</span>.<span style="color:#000000">factory</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Value</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">GetMapping</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">RestController</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* @author liuyp</span>
 <span style="color:#aa5500">* @since 2023/08/22</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@RestController</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">DemoConfigController</span> {
​
    <span style="color:#555555">@Autowired</span>
    <span style="color:#770088">private</span> <span style="color:#000000">AliyunProperties</span> <span style="color:#000000">aliyunProperties</span>;
​
    <span style="color:#555555">@GetMapping</span>(<span style="color:#aa1111">"/config1"</span>)
    <span style="color:#770088">public</span> <span style="color:#000000">Result</span> <span style="color:#000000">config1</span>(){
        <span style="color:#770088">return</span> <span style="color:#000000">Result</span>.<span style="color:#000000">success</span>(<span style="color:#000000">aliyunProperties</span>);
    }
}</span></span>

3 yaml文件

YAML(/ˈjæməl/,尾音类似camel骆驼) 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。它是一个可读性高,用来表达数据序列化的格式。

YAML可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲。

YAML 的配置文件后缀为 .yml或者.yaml

yaml基本语法
  • 使用key和value配置参数值,key和value之间要有 :空格进行分隔。如果使用:分隔,是语法错误

  • 相同层级的key-value,前边要有相同数量的空格。几个空格无所谓,但是必须有相同数量的空格

yaml高级语法

yaml的高级语法,可以让我们配置数组或集合、Map结构的数据,语法如下:

  • 纯量:不可再拆分的基本值。包括:字符串,布尔,整数,浮点数,null,时间,日期

  • 数组:以-空格开头再跟上值,表示数组里的一个元素

  • 对象:使用key: value格式形式,注意冒号后边有一个空格

yaml使用示例
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#221199">username</span><span style="color:#555555">: </span>zhangsan
<span style="color:#221199">user</span><span style="color:#555555">:</span>
<span style="color:#221199">  name</span><span style="color:#555555">: </span>张三  <span style="color:#aa5500">#相当于properties里user.name=张三</span>
<span style="color:#221199">  gender</span><span style="color:#555555">: </span>男  <span style="color:#aa5500">#相当于properties里user.gender=男</span>
<span style="color:#221199">  age</span><span style="color:#555555">: </span>20     <span style="color:#aa5500">#相当于properties里user.age=20</span>
<span style="color:#221199">  girls</span><span style="color:#555555">:      </span><span style="color:#aa5500">#girls是一个集合或数组,集合里现在有3个元素值</span>
<span style="color:#555555">    - </span>小丽
<span style="color:#555555">    - </span>小美
<span style="color:#555555">    - </span>小坤
<span style="color:#221199">  info</span><span style="color:#555555">:</span>
<span style="color:#221199">    email</span><span style="color:#555555">: </span>zhangsan@163.com
<span style="color:#221199">    phone</span><span style="color:#555555">: </span><span style="color:#116644">13800138000</span></span></span>
读取yaml里的配置参数

和刚刚读取properties文件里的参数,是完全相同的

  • @Value("${参数名}"),读取某一个参数

  • @ConfigurationPropperties把一批参数封装成一个JavaBean对象

2. 阿里云OSS配置的配置与读取

把配置参数提取到yml文件里

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#221199">aliyun</span><span style="color:#555555">:</span>
<span style="color:#221199">  endpoint</span><span style="color:#555555">: </span>https<span style="color:#555555">:</span>//oss-cn-beijing.aliyuncs.com
<span style="color:#221199">  accessKeyId</span><span style="color:#555555">: </span>LTAI5tG3TbA9HLs22KEtimyB
<span style="color:#221199">  accessKeySecret</span><span style="color:#555555">: </span>4avUxhaO5KCTl5pqpta3AdU98mT9um
<span style="color:#221199">  bucketName</span><span style="color:#555555">: </span>itheima-liuyp</span></span>

修改工具类读取配置参数

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">util</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">aliyun</span>.<span style="color:#000000">oss</span>.<span style="color:#000000">OSS</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">aliyun</span>.<span style="color:#000000">oss</span>.<span style="color:#000000">OSSClientBuilder</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">beans</span>.<span style="color:#000000">factory</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Value</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">stereotype</span>.<span style="color:#000000">Component</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">multipart</span>.<span style="color:#000000">MultipartFile</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">io</span>.<span style="color:#981a1a">*</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">UUID</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 阿里云 OSS 工具类</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@Component</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">AliOSSUtils</span> {
    <span style="color:#555555">@Value</span>(<span style="color:#aa1111">"${aliyun.endpoint}"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">endpoint</span>;
    <span style="color:#555555">@Value</span>(<span style="color:#aa1111">"${aliyun.accessKeyId}"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">accessKeyId</span>;
    <span style="color:#555555">@Value</span>(<span style="color:#aa1111">"${aliyun.accessKeySecret}"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">accessKeySecret</span>;
    <span style="color:#555555">@Value</span>(<span style="color:#aa1111">"${aliyun.bucketName}"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">bucketName</span>;
​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 实现上传图片到OSS</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">upload</span>(<span style="color:#000000">MultipartFile</span> <span style="color:#000000">file</span>) <span style="color:#770088">throws</span> <span style="color:#000000">IOException</span> {
        <span style="color:#aa5500">// 获取上传的文件的输入流</span>
        <span style="color:#000000">InputStream</span> <span style="color:#000000">inputStream</span> <span style="color:#981a1a">=</span> <span style="color:#000000">file</span>.<span style="color:#000000">getInputStream</span>();
​
        <span style="color:#aa5500">// 避免文件覆盖</span>
        <span style="color:#008855">String</span> <span style="color:#000000">originalFilename</span> <span style="color:#981a1a">=</span> <span style="color:#000000">file</span>.<span style="color:#000000">getOriginalFilename</span>();
        <span style="color:#008855">String</span> <span style="color:#000000">fileName</span> <span style="color:#981a1a">=</span> <span style="color:#000000">UUID</span>.<span style="color:#000000">randomUUID</span>().<span style="color:#000000">toString</span>() <span style="color:#981a1a">+</span> <span style="color:#000000">originalFilename</span>.<span style="color:#000000">substring</span>(<span style="color:#000000">originalFilename</span>.<span style="color:#000000">lastIndexOf</span>(<span style="color:#aa1111">"."</span>));
​
        <span style="color:#aa5500">//上传文件到 OSS</span>
        <span style="color:#000000">OSS</span> <span style="color:#000000">ossClient</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">OSSClientBuilder</span>().<span style="color:#000000">build</span>(<span style="color:#000000">endpoint</span>, <span style="color:#000000">accessKeyId</span>, <span style="color:#000000">accessKeySecret</span>);
        <span style="color:#000000">ossClient</span>.<span style="color:#000000">putObject</span>(<span style="color:#000000">bucketName</span>, <span style="color:#000000">fileName</span>, <span style="color:#000000">inputStream</span>);
​
        <span style="color:#aa5500">//文件访问路径</span>
        <span style="color:#008855">String</span> <span style="color:#000000">url</span> <span style="color:#981a1a">=</span> <span style="color:#000000">endpoint</span>.<span style="color:#000000">split</span>(<span style="color:#aa1111">"//"</span>)[<span style="color:#116644">0</span>] <span style="color:#981a1a">+</span> <span style="color:#aa1111">"//"</span> <span style="color:#981a1a">+</span> <span style="color:#000000">bucketName</span> <span style="color:#981a1a">+</span> <span style="color:#aa1111">"."</span> <span style="color:#981a1a">+</span> <span style="color:#000000">endpoint</span>.<span style="color:#000000">split</span>(<span style="color:#aa1111">"//"</span>)[<span style="color:#116644">1</span>] <span style="color:#981a1a">+</span> <span style="color:#aa1111">"/"</span> <span style="color:#981a1a">+</span> <span style="color:#000000">fileName</span>;
        <span style="color:#aa5500">// 关闭ossClient</span>
        <span style="color:#000000">ossClient</span>.<span style="color:#000000">shutdown</span>();
        <span style="color:#770088">return</span> <span style="color:#000000">url</span>;<span style="color:#aa5500">// 把上传到oss的路径返回</span>
    }
​
}</span></span>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣L14--- 415.字符串相加(JAVA版)-2024年3月17日

1.题目 2.知识点 注1&#xff1a;你可以使用Integer.parseInt()或Double.parseDouble()等方法将字符串转换为整数或浮点数。 public class Main {public static void main(String[] args) {String str "123";int num Integer.parseInt(str);System.out.println(…

深度序列模型与自然语言处理:基于TensorFlow2实践

目录 写在前面 推荐图书 编辑推荐 内容简介 作者简介 推荐理由 写在最后 写在前面 本期博主给大家推荐一本深度学习的好书&#xff0c;对Python深度学习感兴趣的小伙伴快来看看吧&#xff01; 推荐图书 《深度序列模型与自然语言处理 基于TensorFlow2实践》 直达链接…

iOS常见崩溃简介

1. 崩溃 多指在移动设备&#xff08;如iOS、Android设备&#xff09;中或不可移动设备&#xff08;如:Windows、Linux等设备&#xff09;&#xff0c; 在打开或使用应用程序时出现的突然退出中断的情况&#xff08;类似于Windows的应用程序崩溃&#xff09;。 多表现为&#…

MySQL_数据库图形化界面软件_00000_00001

目录 NavicatSQLyogDBeaverMySQL Workbench可能出现的问题 Navicat 官网地址&#xff1a; 英文&#xff1a;https://www.navicat.com 中文&#xff1a;https://www.navicat.com.cn SQLyog 官网地址&#xff1a; 英文&#xff1a;https://webyog.com DBeaver 官网地址&…

使用 opencv 识别答题卡,生成填涂答案

一般答题卡设计时都在试卷4个角预留4个一样大小的黑块 仅能识别选择题判断题之类的填涂答题的题目&#xff0c;不能识别填空题应用题等其它主观题 使用 opencv 识别试卷图片中所有黑块&#xff0c;再根据黑块大小获取四个角的位置&#xff0c;根据四个黑块位置校正图像 将图…

【Numpy】练习题100道(51-75题)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; #学习笔记# Git-hub链接 目录 1.题目列表 2.题解 1.题目列表 51. 创建一个表示位置&#xff08;x,y&#xff09;和颜色&#xff08;r,g,b&#xff09;的结…

chatGLM3+chatchat实现本地知识库

背景 由于客服存在大量的问题为FAQ问题&#xff0c;需要精准回复客户&#xff0c;所以针对此类精准问题&#xff0c;通过自建同量数量库进行回复。 落地方案 通过chatGLM3-6Blangchain-chatchatbge-large-zh实现本地知识库库。 注意&#xff1a;相关介绍和说明请看官网~ 配置要…

【解读】NIST网络安全框架CSF 2.0

2014年&#xff0c;NIST&#xff08;美国国家标准与技术研究所&#xff0c;类似于中国的工信部&#xff09;首次发布了网络安全框架CSF&#xff08;Cybersecurity Framework)&#xff0c;十年后&#xff0c;在2024年2月26日发布了重大更新&#xff08;CSF 2.0&#xff09;&…

C++初阶:string的使用与STL

目录 1. C标准库与STL2. string是什么3. string的使用3.1 构造与拷贝构造3.2 遍历访问方式3.3 STL中算法操作相关内容3.4 容量相关成员函数3.5 内容修改相关成员函数3.6 string类操作成员函数3.7 string的非成员函数 1. C标准库与STL 编程语言标准库中&#xff0c;有着许多基础…

wps技巧二实现每一行文字后面统一添加数据

效果 操作 查找&#xff0c;输入^p 替换&#xff0c;输入 n m p q^p&#xff0c;测试数据&#xff0c;随意替换成你想要的 结果

MySQL-- B+ 树

一、InnoDB 是如何存储数据的&#xff1f; InnoDB 的数据是按「数据页」为单位来读写的 数据库的 I/O 操作的最小单位是页&#xff0c;InnoDB 数据页的默认大小是 16KB 单个数据页的结构及作用 多个数据页之间的逻辑连接&#xff08;双向链表&#xff09;&#xff0c;不需要物…

STM32/GD32——FreeRTOS任务管理与相关机制

芯片选型 Ciga Device — GD32F470系列 任务管理 任务处理API 操作 API 动态任务创建 xTaskCreate 任务删除 vTaskDelete 静态任务创建 vTaskCreateStatic 挂起任务 vTaskSuspend 恢复任务 vTaskResume 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTa…

vulhub中GIT-SHELL 沙盒绕过漏洞复现(CVE-2017-8386)

GIT-SHELL 沙盒绕过&#xff08;CVE-2017-8386&#xff09;导致任意文件读取、可能的任意命令执行漏洞。 测试环境 为了不和docker母机的ssh端口冲突&#xff0c;将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa&#xff0c;这是ssh的私钥&#xff0c;连接的时候请指…

固态硬盘有缓存和没缓存有什么区别

固态硬盘&#xff08;SSD&#xff09;已经成为现代计算机的重要组成部分&#xff0c;它们提供了比传统机械硬盘更快的读写速度&#xff0c;从而显著提升了操作系统的运行速度和应用程序的加载效率。 其中&#xff0c;缓存&#xff08;Cache&#xff09;是固态硬盘中一个重要的…

【SpringCloud】使用Seata实现分布式事务

目录 一、Seata 框架的需求背景二、Seata 事务模式与架构2.1 Seata 组成2.2 Seata 事务模式 三、Seata 实战演示3.1 部署 Seata Server3.1.1 下载 Seata Server3.1.2 更改 Seata Server 配置3.1.3 创建 Seata Server 所需的数据库、数据库表3.1.4 启动 Seata Server 3.2 Seata …

ROS2从入门到精通1-1:详解ROS2话题通信机制与自定义消息

目录 0 专栏介绍1 话题通信模型2 话题模型实现(C)3 话题模型实现(Python)4 自定义消息 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 &#x1f680;详情&a…

【最新版源码】快递平台独立版小程序源码|带cps推广营销流量主+前端

源码介绍&#xff1a; 快递代发快递代寄寄件小程序可以对接易达云洋一级总代 快递小程序&#xff0c;接入云洋/易达物流接口&#xff0c;支持选择快递公司&#xff0c;三通一达&#xff0c;极兔&#xff0c;德邦等&#xff0c;功能成熟 如何收益: 1.对接第三方平台成本大约4…

CoAP计算机协议,应用于物联网

什么是CoAP协议&#xff1f; CoAP&#xff08;Constrained Application Protocol&#xff0c;受限应用协议&#xff09;是一种专为物联网&#xff08;IoT&#xff09;设备和资源受限网络设计的应用层协议。它的诞生也是由于物联网设备大多都是资源限制型的&#xff0c;比如 CP…

【GPT-SOVITS-02】GPT模块解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

Java之SpringBoot基础夯实——八股文【2024面试题案例代码】

1、什么是 Spring Boot&#xff1f; Spring Boot 是一个开源的Java开发框架&#xff0c;由Pivotal团队开发&#xff0c;其核心目标是简化新Spring应用的初始搭建和开发流程。它以Spring框架为基础&#xff0c;通过自动配置和约定优于配置的原则&#xff0c;极大程度地减少了手…
最新文章