14. File upload


[Shang Silicon Valley] SpringBoot2 Zero-Basic Introductory Tutorial - Lecturer: Lei Fengyang
Notes

The road is still going on, the dream is still waiting

1. Page form

1.1. Single file upload

<form method="post" th:action="@{/upload}" enctype="multipart/form-data">
    <input type="file" name="file"><br>
    <input type="submit" value="提交">
</form>

1.2. Multiple file upload

<form method="post" th:action="@{/upload}" enctype="multipart/form-data">
    <input type="file" name="file" multiple><br>
    <input type="submit" value="提交">
</form>

2. File upload implementation

MultipartFile: Automatically encapsulate uploaded files

@RequestPart: Get the file item inside the form

2.1, code

//自动封装上传过来的文件
@PostMapping("/upload")
public String upload(@RequestParam("email") String email,
                     @RequestParam("username") String username,
                     @RequestPart("headerImg") MultipartFile headerImg,
                     @RequestPart("photos") MultipartFile[] photos) throws IOException {
    
    

    // 获取上传的信息
    log.info("上传的信息:email={},username={},headerImg={},photos={}",
            email,username,headerImg.getSize(),photos.length);

    // 判断上传文件非空
    if(!headerImg.isEmpty()){
    
    
        // 获取上传文件名字
        String originalFilename = headerImg.getOriginalFilename();
        // 保存到服务器指定地址
        headerImg.transferTo(new File("H:\\cache\\"+originalFilename));
    }

    // 判断多上传文件不为空
    if(photos.length > 0){
    
    
        // 遍历数组中对象
        for (MultipartFile photo : photos) {
    
    
            // 方式同上
            if(!photo.isEmpty()){
    
    
                String originalFilename = photo.getOriginalFilename();
                photo.transferTo(new File("H:\\cache\\"+originalFilename));
            }
        }
    }
    // 上传成功,跳转到主页面
    return "main";
}

2.2. Configuration

Configuration class location: org.springframework.boot.autoconfigure.web.servlet.MultipartProperties

Prefix: spring.servlet.multipart

spring:
  servlet:
    multipart:
      maxFileSize: 10MB # 单个文件大小
      maxRequestSize: 100MB # 整体上传文件大小

3. Principle of automatic configuration

3.1、MultipartAutoConfiguration类

Automatic configuration class location: org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({
    
     Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {
    
    

	private final MultipartProperties multipartProperties;

	public MultipartAutoConfiguration(MultipartProperties multipartProperties) {
    
    
		this.multipartProperties = multipartProperties;
	}

	// 文件上传配置信息
	@Bean
	@ConditionalOnMissingBean({
    
     MultipartConfigElement.class, CommonsMultipartResolver.class })
	public MultipartConfigElement multipartConfigElement() {
    
    
		return this.multipartProperties.createMultipartConfig();
	}

	// 文件上传解析器
	@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
	@ConditionalOnMissingBean(MultipartResolver.class)
	public StandardServletMultipartResolver multipartResolver() {
    
    
		StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
		multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
		return multipartResolver;
	}

}

3.2. Principle steps

1. When the request comes in, use the file upload parser to judge (isMultipart), and if it is an upload request type, wrap the file upload request (resolveMultipart, return MultipartHttpServletRequest).

2. The parameter parser parses the file content in the request and encapsulates it into a MultipartFile.

insert image description here

3. Encapsulate the file information in the request into a Map; MultiValueMap<String, MultipartFile>, use FileCopyUtils to copy the file stream

    @PostMapping("/upload")
    public String upload(@RequestParam("email") String email,
                         @RequestParam("username") String username,
                         @RequestPart("headerImg") MultipartFile headerImg,
                         @RequestPart("photos") MultipartFile[] photos)

Guess you like

Origin blog.csdn.net/zhao854116434/article/details/130145769