案例(文件上传、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只能一个一个

posted @ 2024-01-27 10:58  launch  阅读(8)  评论(0编辑  收藏  举报