在springboot中使用文件上传

1:springMVC文件上传介绍

在springMVC的9大组件中,其中的一个就是MultipartResolver,即文件上传解析组件,该组件当是文件上传请求时会将HttpServletRequest类,解析生成为MultipartHttpServletRequest类,该类在继承了HttpServletRequest的同时,还实现了接口MultipartRequest,源码如下:

public interface MultipartRequest {
    
    

	Iterator<String> getFileNames();

	@Nullable
	MultipartFile getFile(String name);

	List<MultipartFile> getFiles(String name);

	Map<String, MultipartFile> getFileMap();

	MultiValueMap<String, MultipartFile> getMultiFileMap();
	
	@Nullable
	String getMultipartContentType(String paramOrFileName);

}

可以看到接口中定义了很多文件相关的方法,因此MultipartHttpServletRequest就拥有了操作文件的能力。对于MultipartResolver接口有两个是实现类,一个是CommonMultipartResolver,另外一个是StandardServletMultipartResolver,由于前者需要依赖于apache的第三方包,而后者只需要servlet的API就可以了,所以在实际使用中StandardMultipartResolver使用的比较多。因此,想要完成文件上传操作,只要是能够创建出StandardMultipartResolver就可以了,而在springboot中,在没有指定上传文件解析器时,创建的也正是StandardMultipartResolver,自动创建的源码如下:

@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 {
    
    
	@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
	@ConditionalOnMissingBean(MultipartResolver.class)
	public StandardServletMultipartResolver multipartResolver() {
    
    
		StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
		multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
		return multipartResolver;
	}
}

2:配置上传文件参数

### 配置springboot自动生成StandardMultipartResolver对象设置开始 ###
# 指定文件上传文件夹
spring.servlet.multipart.location=/Users/xb/Desktop/D/dongsir-dev/test-jsp-in-springboot
# 限制单个文件的大小 5M
spring.servlet.multipart.max-file-size=5242880
# 限制所有文件的最大大小
spring.servlet.multipart.max-request-size=20MB
### 配置springboot自动生成StandardMultipartResolver对象设置结束 ###

3:jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <form method="post" action="./request" enctype="multipart/form-data">
        <input type="file" name="file" value="请选择要上传文件">
        <input type="submit" value="提交">
    </form>
</body>
</html>

4:跳转jsp接口

@RequestMapping("/upload/page")
public String uploadPage() {
    
    
    return "upload";
}

5:接口上传请求

这里直接使用HttpServletRequest作为参数,另外还可以使用javax.servlet.http.Part直接通过write方法就可以了,这是servlet API中提供的接口,还可以使用org.springframework.web.multipart.MultipartFile,这是spring提供的,这种方式直接使用其transfterTo方法就可以了。源码如下:

@RequestMapping("/upload/request")
public Map<String, Object> uploadRequest(HttpServletRequest request) {
    
    
    Map<String, Object> res = new HashMap<>();
    MultipartHttpServletRequest multipartHttpServletReq = null;
    if (request instanceof MultipartHttpServletRequest) {
    
    
        multipartHttpServletReq = (MultipartHttpServletRequest) request;
        MultipartFile multipartFile = multipartHttpServletReq.getFile("file");
        String originalFilename = multipartFile.getOriginalFilename();
        res.put("上传文件名", originalFilename);
        res.put("上传结果", "成功");
        try {
    
    
            File file = new File(originalFilename);
            multipartFile.transferTo(file);
        } catch (Exception e) {
    
    }
        return res;
    } else {
    
    
        res.put("result", "不是文件上传请求");
        return res;
    }
}

6:上传测试

访问http://localhost:8089/testBean/upload/page选择文件上传即可。

猜你喜欢

转载自blog.csdn.net/wang0907/article/details/113095900
今日推荐