> 文章列表 > SpringBoot学习笔记-文件上传

SpringBoot学习笔记-文件上传

SpringBoot学习笔记-文件上传

文件上传

简介:SpringBoot文件上传、UUID文件名上传及按日期目录分类上传。

文章目录

  • 文件上传
    • 1. 创建 templates/upload.html , 要求头像只能选择一个, 而potos可以上传多个图片
    • 2. 创建 UploadController.java
    • 3. 修改WebCofig配置,放行/upload.html 和 /upload 请求
    • 4. 根据项目需求修改文件上传的参数,否则文件上传会抛出异常
    • 5. resources/application.yml文件配置
    • 6. 运行结果
    • 7. 扩展
  • 需求: 演示 Spring-Boot 通过表单注册用户,并支持上传图片
  • 需求: 演示 Spring-Boot 通过表单注册用户,并支持上传图片

1. 创建 templates/upload.html , 要求头像只能选择一个, 而potos可以上传多个图片

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>upload</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center"><h1>注册用户~</h1><form action="#" method="post" th:action="@{/upload}" enctype="multipart/form-data">用户名:<input type="text" style="width:150px" name="name"/><br/><br/>电 邮:<input type="text" style="width:150px" name="email"/><br/><br/>年 龄:<input type="text" style="width:150px" name="age"/><br/><br/>职 位:<input type="text" style="width:150px" name="job"/><br/><br/>头 像:<input type="file" style="width:150px" name="header"><br/><br/>宠 物:<input type="file" style="width:150px" name="photos" multiple><br/><br/><input type="submit" value="注册"/><input type="reset" value="重新填写"/></form>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>

2. 创建 UploadController.java

package com.xjz.springboot.controller;import com.xjz.springboot.Utils.WebUtils;
import lombok.extern.slf4j.Slf4j;
import org.omg.CORBA.INTERNAL;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@Slf4j
@Controller
public class UploadController {@GetMapping("/upload.html")public String uploadPage(){return "upload";}/*** MultipartFile 自动封装上传过来的文件* @return*/@ResponseBody@PostMapping("/upload")public String upload(@RequestParam("name") String name,@RequestParam("email")String email,@RequestParam("age")Integer age,@RequestParam("job")String job,@RequestParam("header")MultipartFile header,@RequestParam("photos")MultipartFile[] photos) throws IOException {log.info("上传的信息 name={}, email={}, age={}, job={}, header={},photo={}",name,email,age,job,header.getSize(),photos.length);//也可以自己动态的创建上传文件目录 , 来存放文件 , 比如在resources/static/images/upload/String path = ResourceUtils.getURL("classpath:").getPath();File file = new File(path + WebUtils.getUploadFileDirectory());if (!file.exists()) { //如果目录不存在,我们就创建,在 java iofile.mkdirs();}if (!header.isEmpty()){ //处理头像//保存到文件服务器或OSS 服务器//需要先创建好 d://temp_uploadString originalFilename = header.getOriginalFilename();String fileName = UUID.randomUUID().toString() + "_" + System.currentTimeMillis() + originalFilename;//方式1:指定某个目录存放上传文件//header.transferTo(new File("d://temp_upload//" + originalFilename));//方式2:动态的创建文件存放文件header.transferTo(new File(file.getAbsolutePath() + "/" + fileName));log.info("保存文件的绝对路径={}" + file.getAbsolutePath());}if (photos.length>0){for (MultipartFile photo : photos) {if (!photo.isEmpty()){String originalFilename = photo.getOriginalFilename();String fileName = UUID.randomUUID().toString() + "_" + System.currentTimeMillis() + originalFilename;//photo.transferTo(new File("d:\\\\temp_upload\\\\" + originalFilename));//保存到动态创建的目录photo.transferTo(new File(file.getAbsolutePath() + "/" + fileName));}}}return "注册用户成功/文件上传成功";}
}

3. 修改WebCofig配置,放行/upload.html 和 /upload 请求

package com.xjz.springboot.webConfig;import com.xjz.springboot.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 这里实现Spring-Boot 定制功能,加入自己的配置*/
@Configuration
public class WebConfig implements WebMvcConfigurer {//将我们的拦截器, 注入到容器中@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")  //拦截所有请求.excludePathPatterns("/","/login","/images","/upload.html","/upload");//放行的请求,可以根据需要添加}//原始方法添加拦截器--》bean容器
/*    @Beanpublic WebMvcConfigurer webMvcConfigurer(){return new WebMvcConfigurer() {@Overridepublic void addInterceptors(InterceptorRegistry registry) {System.out.println("addInterceptors~~");//加入我们的拦截器registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")  //拦截所有请求.excludePathPatterns("/","/login","/images");//放行的请求,可以根据需要添加}};}*/}

4. 根据项目需求修改文件上传的参数,否则文件上传会抛出异常

SpringBoot学习笔记-文件上传

5. resources/application.yml文件配置

spring:servlet:multipart:max-file-size: 10MBmax-request-size: 50MB

6. 运行结果

SpringBoot学习笔记-文件上传

SpringBoot学习笔记-文件上传

7. 扩展

1.解决文件覆盖问题, 如果文件名相同, 会出现覆盖问题, 如何解决

//在UploadControl.java 文件中 添加UUID随机文件名
String fileName = UUID.randomUUID().toString() + "_" + System.currentTimeMillis() + originalFilename;

SpringBoot学习笔记-文件上传

  1. 解决文件分目录存放问题, 如果将文件都上传到一个目录下,当上传文件很多时,会造成访问文件速度变慢,因此 可以将文件上传到不同目录 比如 一天上传的文件,统一放到一个文件夹 年/月/日, 比如 2023/04/01 目录

WebUtils.java

package com.xjz.springboot.Utils;import java.text.SimpleDateFormat;
import java.util.Date;public class WebUtils {//定义一个文件上传的路径public static String UPLOAD_FILE_DIRECTORY = "static/images/upload/";//编写方法,生成一个目录-根据当前日期 年/月/日public static String getUploadFileDirectory() {//format的用法 是将当前时间格式转换为指定格式return UPLOAD_FILE_DIRECTORY + new SimpleDateFormat("yyyy/MM/dd").format(new Date());}
}

SpringBoot学习笔记-文件上传

最后,祝大家愚人节快乐~