1.Application.java
package com.niugang;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.AbstractHttp11Protocol;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
//解决包tomcat冲突
//@EnableAutoConfiguration(exclude={WebMvcAutoConfiguration.class})
//组件扫描,会自动扫描springboot启动类包及其子包下的注解文件
//@ComponentScan("com.niugang.controller")
//springboot注解
//springboot1.2+之后用@SpringBootApplication替代了三个注解
@SpringBootApplication
//mapper 接口类扫描包配置
@MapperScan(value={"com.niugang.dao"})
public class Application extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
//Tomcat large file upload connection reset
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
return tomcat;
}
class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer{
@SuppressWarnings("rawtypes")
@Override
public void customize(Connector connector) {
AbstractHttp11Protocol protocolHandler = (AbstractHttp11Protocol)connector.getProtocolHandler();
protocolHandler.setMaxSwallowSize(-1);
}
}
}
上面代码事为了解决
tomcatEmbedded这段代码是为了解决上传文件大于10M出现连接重置的问题。此异常内容GlobalException也捕获不到
2.UploadController.java
package com.niugang.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
/**
* 文件上传
*
* @author niugang
*
*/
@Controller
public class UploadController {
@RequestMapping("toupload")
public String toUpload() {
return "upload";
}
@RequestMapping("upload")
public String upload(MultipartFile file, ModelMap map, HttpServletRequest request) {
if (file.isEmpty()) {
map.put("uploadResult", "文件不能为空");
return "upload";
}
File filePath = new File("d:/myweb/upload");
if (!filePath.exists()) {
filePath.mkdirs();
}
File realPath = new File(filePath + "/" + file.getOriginalFilename());
try {
/*
* 或者这样
* File name = new File(file.getOriginalFilename());
*file.transferTo(name);
*/
FileCopyUtils.copy(file.getInputStream(), new FileOutputStream(realPath));
map.put("uploadResult", "文件上传成功");
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
return "upload";
}
/**
*
* @return 第二种方式
* @throws IOException
*/
@RequestMapping(value = "/upload1", method = RequestMethod.POST)
@ResponseBody
public String upload1(MultipartFile file) throws IOException {
byte[] bytes = file.getBytes();
//这样默认上传文件就放在当前 项目路径下
File name = new File(file.getOriginalFilename());
FileCopyUtils.copy(bytes, name);
return name.getAbsolutePath();
}
}
3.application.properties
#文件上传相关配置
#org.springframework.boot.autoconfigure.web.MultipartProperties 具体配置类
#spring.http.multipart.enabled=true #默认支持文件上传.
#spring.http.multipart.file-size-threshold=0 #支持文件写入磁盘.
# 上传文件的临时目录
#spring.http.multipart.location=
# 最大支持文件大小
spring.http.multipart.max-file-size=2Mb #默认为1m
#spring.http.multipart.max-request-size=10Mb # 最大支持请求大小 默认为10m
4.FileUploadException.java 文件上传错误提示
package com.niugang.exception;
import org.springframework.boot.autoconfigure.web.MultipartProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.servlet.ModelAndView;
/**
* @ControllerAdvice
* 它通常用于定义{@link ExceptionHandler @ExceptionHandler}、
* {@link InitBinder @InitBinder}和{@link ModelAttribute @ModelAttribute}
*
* 方法适用于所有{@link RequestMapping @RequestMapping}方法。
*
* @author niugang 文件上传异常处理类
*
*/
@ControllerAdvice
/**
* 从配置文件根据前缀读取设置 处理需要字段外还需要,set方法,否则值注入不进来
*
* @author niugang
*
*/
@ConfigurationProperties(prefix = "spring.http.multipart")
public class FileUploadException {
private String maxFileSize;
public String getMaxFileSize() {
return maxFileSize;
}
public void setMaxFileSize(String maxFileSize) {
this.maxFileSize = maxFileSize;
}
@ExceptionHandler(MultipartException.class)
public ModelAndView handleError1(MultipartException e) {
ModelAndView modelAndView = new ModelAndView("upload");
// 如果application.properties里面没有设置,则读取系统默认的文件大小
if (this.getMaxFileSize() == null) {
MultipartProperties multipartProperties = new MultipartProperties();
modelAndView.addObject("uploadResult", "最大上传为:" + multipartProperties.getMaxFileSize());
} else {
modelAndView.addObject("uploadResult", "最大上传为:" + this.getMaxFileSize());
}
return modelAndView;
}
}
5.upload.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Spring Boot文件上传</h1>
<#if uploadResult??>
${uploadResult}
</#if>
<form method="POST" action="upload" enctype="multipart/form-data">
<input type="file" name="file" /><br />
<br /> <input type="submit" value="提交" />
</form>
</body>
</html>
6.启动项目
http://localhost:8080/myweb/toupload
文件上传成功:
文件上传失败:
微信公众号