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.jpgString filename = avatar.getOriginalFilename();//	2. 截取得到后缀名。比如:.jpgString suffix = filename.substring(filename.lastIndexOf("."));//	3. 重新生成新的文件名。比如:2ceea81e-2a4d-4709-8332-367ea4e34e23.jpgfilename = 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 {@Testpublic 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("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.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 {@Autowiredprivate 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.mzph.cn/news/752463.shtml

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

相关文章

try~catch语句

用try~catch语句来处理异常&#xff0c;将可能出现的异常操作放在 try部分&#xff0c;将发生异常后的处理放在catch部分。 带finally子语句的try~catch 语法格式 执行机制 ★注意★&#xff1a; try~catch中执行了return → finally子语句仍被执行&#xff1b; try~catch中执…

VScode(8)之阅读大型CC++工程

VScode(8)之阅读大型CC工程(Linux内核)代码 Author&#xff1a;Once Day Date&#xff1a;2023年4月25日/2024年3月17日 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: VScode开发_Once-Day的博客-CSDN博客 参考文档: 1. 历史包袱 由于上世纪70-80年代的…

语音神经科学—04.Speech Computations of the Human Superior Temporal Gyrus

Speech Computations of the Human Superior Temporal Gyrus&#xff08;人类颞上沟的言语计算&#xff09; 专业术语 Superior Temporal Gyrus 颞上沟 phoneme 音素 syllable 音节 speech perception 语音感知 vocal tract 声道 acoustic 声学的 articulatory 发音的 spectro…

【基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸设计】

1.前言 基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸 在当今物联网与智能家居科技日益发达的时代&#xff0c;将先进技术和传统养鱼艺术融合&#xff0c;创造出智能、自动化且极具观赏价值的鱼缸已成为一种创新趋势。SeeedStudio推出的Xiao ESP32-S3 Sense开发板以其卓越的性能…

command failed: npm install --loglevel error --legacy-peer-deps

在使用vue create xxx创建vue3项目的时候报错。 解决方法&#xff0c;之前使用的https://registry.npm.taobao.org 证书过期更换镜像地址即可 操作如下&#xff1a; 1.cd &#xff5e;2.执行rm .npmrc3. sudo npm install -g cnpm --registryhttp://registry.npmmirror.com…

基于高斯模型的运动目标检测(车辆检测),Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

Vue3:标签的ref属性用法

一、情景说明 我们在写前端页面的时候&#xff0c;肯定会遇到获取DOM内容的情况。 以往&#xff0c;我们是用原生的js方法去获取&#xff0c;如document.getXxxx 但是&#xff0c;这中方法会有个问题&#xff0c;如果父组件和子组件的id相同&#xff0c;则会出错。 在Vue3中&…

ASP.NET 服务器控件

目录 一、使用的软件 1、下载 2、新建文件&#xff08;写一个简单的web网页&#xff09; 二、相关知识点 1、Web窗体网页的组件 &#xff08;1&#xff09;可视化组件 &#xff08;2&#xff09;用户接口逻辑 2、Web Form网页的代码模型 &#xff08;1&#xff09;单文件…

《硬件历险》之Mac抢救出现问题的时间机器硬盘中的数据

本文虽然使用“抢救”一词&#xff0c;但是运气比较好&#xff0c;远没有达到访问和修改底层的信息来抢救的地步。如果你是需要通过访问和修改底层信息来抢救数据&#xff0c;建议阅读刘伟的《数据恢复技术深度揭秘&#xff08;第二版&#xff09;》或者寻找专业人士的帮助。 《…

视频基础知识(一) 视频编码 | H.26X 系列 | MPEG 系列 | H.265

文章目录 一、视频编码二、 H.26X 系列1、H.2612、H.2633、H.2643.1 I帧3.2 P帧3.3 B帧 4、H.265 三、 MPEG 系列1、MPEG-12、MPEG-23、MPEG-44、MPEG-7 &#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&…

微信小程序调用百度智能云API(菜品识别)

一、注册后生成应用列表创建应用 二、找到当前所需使用的api菜品识别文档 三、点链接看实例代码 这里需要使用到如下几个参数&#xff08;如下&#xff09;&#xff0c;其他的参数可以不管 client_id &#xff1a; 就是创建应用后的API Keyclient_secret&#xff1a; 就是创建…

GAN及其衍生网络中生成器和判别器常见的十大激活函数(2024最新整理)

目录 1. Sigmoid 激活函数 2. Tanh 激活函数 3. ReLU 激活函数 4. LeakyReLU 激活函数 5. ELU 激活函数 6. SELU 激活函数 7. GELU 激活函数 8. SoftPlus 激活函数 9. Swish 激活函数 10. Mish 激活函数 激活函数(activation function)的作用是对网络提取到的特征信…

鸿蒙开发实战:【Faultloggerd部件】

theme: z-blue 简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native In…

21 OpenCV 直方图均衡化

文章目录 直方图概念均衡的目的equalizeHist 均衡化算子示例 直方图概念 图像直方图&#xff0c;是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数&#xff0c;据此生成的直方图&#xff0c;称为图像直方图-直方图。直方图反映了图像灰度的分布情况。 均衡的目的…

Ypay源支付2.8.8免授权聚合免签系统

本帖最后由 renleixiaoxu 于 2024-3-15 09:46 编辑 产品介绍 XPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决 知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的Thin…

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状&#xff0c;可自由动态更改画线的粗细、拐角圆滑度、颜色&#xff0c;自由增减节点&#xff0c;不额外增加gameobject&#xff0c;并且在原生的UGUI上以ScreenSpace-Overlay的状态下&#xff0c;显示效果如下所示 …

数学建模-邢台学院

文章目录 1、随机抽取的号码在总体的排序2、两端间隔对称模型 1、随机抽取的号码在总体的排序 10个号码从小到大重新排列 [ x 0 , x ] [x_0, x] [x0​,x] 区间内全部整数值 ~ 总体 x 1 , x 2 , … , x 10 总体的一个样本 x_1, x_2, … , x_{10} ~ 总体的一个样本 x1​,x2​,……

ffmpeg 滤镜实现不同采样率多音频混音

音频混音在音视频开发中是十分重要的一个环节,所谓音频混音就是将所有需要混音的数据相加得到混音数据,然后通过某个算法进行非法数据的处理;例如相加数值超过最大值,最小值等! 在实际的音频开发中,要实现混音的流程如下: 因此我们的编码实现就分为五部分:寻找…

【机器学习300问】37、什么是迁移学习?

一、什么是迁移学习&#xff1f; &#xff08;1&#xff09;它的出现是为了解决什么问题&#xff1f; 迁移学习是为了解决深度学习中由于数据不足导致的学习效果受限以及跨领域知识的有效利用等问题而发展起来的一种重要技术手段。 ① 缺少训练数据 在许多实际应用中&#xf…

【GPT-SOVITS-05】SOVITS 模块-残差量化解析

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