案例(文件上传、value-configure注解)包括上传工具阿里云OSS
restful开发规范
约定可以打破不是规定
通常url末尾那个描述功能模块用复数,因为一般是此类资源。不是单个资源
直接日志记录来替代system.print
@slf4j定义在类上面
替换下面这个创建log日志对象
private static Logger log = LoggerFactory.getLogger(DeptController.class);
log.info("");
指定请求响应调用get方法
在这个服务器响应映射@RequestMapping("这里写url页面/",method = RequestMethodGET)
@RequestMapping垃圾不用了用衍生注解@GetMapping("/depts")
@PostMapping
1.开发流程
明确需求
接口文档
思路分析
接口开发
2.接口调试
postman测试
前后端联调
@PathVariable路径参数
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
log.info("删除的部门{}",id);
//这里{}作为占位符替换为id
return "Ok";
}
分页查询
PageHelper插件
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
//员工信息查询
@Select("select * from emp")
public List<Emp> list();
@Override
public PageBean page(Integer page, Integer pageSize){
//1. 设置分页参数
PageHelper.startPage(page,pageSize);
//2. 执行查询
List<Emp> empList = empMapper.list();
Page<Emp> p = (Page<Emp>) empList;
//3.封装PageBean对象
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}
分页条件查询不但传入页码和每页大小。还要传入多项条件查询的参数,日期参数用@DateFormat(pattern = "yyyy-大MM-小dd") LocalDate begin,
就controller层需要注解日期。service层同样传参数不需要日期注解。
但是在service实现类中第二部执行查询service调用list方法的时候需要把查询条件那些参数传进去。
文件上传
本地存储
阿里云OSS
本地存储
本地,图片,视频,音频上传到服务器
关于这个文件上传,form表单标签
enctype默认是那个xxxform但是如果要文件上传, 就要改成multipart/form-data还要input的type改成file
表单的提交方式是post
<form action "/upload” enctype "multipart/form-data"<>
姓名: <input type="text"name="username"><br>年龄: <input type="text” name="age"><br>
头像: <input type="file” name="image"><br><input type="submit” value="提交"></form>
@RestController
public class UploadController{
@PostMapping("/upload")
public Result upload(String username , Integer age, MultipartFile image){
return Result.success():
}
}
文件上传要保证方法形参和表单项input的name保持一致如果不一致可以用RequestParam
这个文件类型的参数类型是MutipartFile
本地存储
就是服务器接受,上传的文件存放在本地
直接image.调用transferto("")
@slf4i
@RestController
public class UploadController{
@PostMapping("/upload")
public Result upload(String username,Integer age,MultipartFile image) throws Exception{
loq.info("文件上传: {},{},{}",username, age, image);
//获取原始文件名
String originalFilename = image.getOriginalFilename();
【 1 】
//将文件存储在服务器的做盘目录中
image.transferTo(new File("E:\\images\\"+originalFilename));
return Result.success();
}
}
为了防止这个文件名相同构成的文件覆盖,就不能用原始文件名,使用uuid就是随机字符串且唯一
【 1 】
//构造唯一的文件名(不能重复) -uuid(通用唯一识别码) de49685b-61c0-4b11-80fa-c71e95924018
int index = originalFilename.lastIndexOf("."); //获取文件名尾部后缀的位置
String extname = originalFilename.substring(index);
String newFileName = UUID.randomUUID().toString() + extname;
log.info("新的文件名: {}",newEileName);
在SprinaBoot中,文件上传,默认单个文件允许最大大小为 1M。如果需要上传大文件,可以进行如下配置
#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小(一次请可以上传多个文件)多个文件总大小
spring.servlet.multipart.max-request-size=100MB
String getOriginalFilename();//获取原始文件名
void transferTo(File dest);//将接收的文件转存到磁盘文件中long getSize();//获取文件的大小,单位: 字节
byte[] getBytes(); //获取文件内容的字节数组
InputStream getlnputStream();//获取接收到的文件内容的输入流
#阿里云OSS的部署
1、对象存储OSS开通2、创建bucket3、创建AccessSecret
创建bucket以及accesskey:地域默认-->读写权限设置为公共读-->右上角头像Accesskey管理-继续使用->在创建accesskey的时候务必记住你的密钥
因为现在只能看一次secret,密钥是合法身份凭证。
寻找oss官方文档,找到bucket存储空间-->sdk下载-->sdk示例-->文档中心打开-->java安装(配置好依赖)
这一部分我不多说了,大概下面会有写好的utils工具类
找到文件上传的简单上传。
找到上传文件流/直接复制代码粘贴自动生成文件
**关于代码**,域名endpoint打开oss管理找到bucket点击概览最下面把第一个地域节点外网那个复制到endpoint
找回到accesskey直接将id复制到accesskeyid
可以禁用失效,重新创建
文件属性安全获得绝对路径
阿里云OSS的文件上传工具
1.引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
2.上传图片接口开发
创建com/utils文件夹将javawebday11的资料阿里云oss/utils.java复制到utils
文件上传的类方法,必须是@PostMapping的post方式注解
因为utils下的工具类要new就直接用@component来注解抛入ioc容器
@RestController
public class UploadController (
@Autowired
private AlioSsUtils aliossUtils;
@PostMapping(“/upload”)
public Result upload(MultipartFjle image) throws IOException {
String url= aliossUtilsuploadimage); //调用阿里云0S5工具类,上传上来的文件存入阿里云
return Result.success(url); //将图片上传完成后的url返回,用于浏器回显展示
}
}
关于编辑操作的查询回显
//根据id查询
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id){
Emp emp = empService.getById(id) ;
return Result.success(emp);
}
****
@Override
public Emp getById(Integer id) {
return empMapper.getById(id) ;
}
****
//根据ID食询员工信息
@Select("select * from emp where id = #{id}")
Emp getById(Integer id) ;
关于这个注解后面的路径问题
controller类上面加了RequestMapping("/emps")所以类下的方法就可以不用再写/emps直接"/{id}"
关于utils的定义endpoint成员变量的属性赋值直接写进spring配置文件application.properties中自定义key值
aliyun.oss.endpoint=https://oss-cn-hangzhoualiyuncs.com
aliyun.oss.accessKeyId=LTAI4GCH1vX6DKqJWxd6nEuW
aliyun.oss.accessKeySecret=yBshYweHOpqDuhCArrVHwIiBKpygSL
aliyun.oss.bucketName=web-tlias
在定义utils工具类时不用给成员属性复制,
直接使用values注解注入值@Value("${配置文件中的key}")
@Component
public class Aliossutils{
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
yml文件格式
-大小写敏感
-数值前边必须有空格,作为分隔符
-使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)
-缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
-#表示注释,从这个字符一直到行尾,都会被解析器忽略
@ConfigureProperties
也就是yml文件中自定义的key值要与成员变量属性名一致
才能将值调用yml文件中的
@ConfigurationProperties (prefix = "aliyun.oss")
用prefix来配置key值的前缀
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
写完configure可能会有警告,注入上面这个依赖,在写完configure注解以后,再写yml键值对的时候会有提示
这个依赖可有可无,无非就是提示
configure比value,c可以批量,value只能一个一个