参考:
Spring mvc请求处理流程详解(一)之视图解析
1 概述
采用commons-fileupload 实现
首先添加依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
配置multipart类型解析器
@Bean
public MultipartResolver multipartResolver(){
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxUploadSize(50*1024*1024);//设置文件最大上传size
resolver.setMaxInMemorySize(40*1024*1024);
return resolver;
}
2 jsp
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
<input name="picture" id="picture" type="file"/>
<input type="submit" value="上传"/>
</form>
3 contoller
@Controller
public class UploadController {
Logger logger = Logger.getLogger(UploadController.class);
@RequestMapping("upload")
public String upload(HttpServletRequest request, Model model, MultipartFile picture){
ServletContext sc = request.getSession().getServletContext();
String uploadPath ="upload/picture"+ new SimpleDateFormat("yyyy").format(new Date());
creatFileDir(sc,uploadPath);
String dest = sc.getRealPath("/");
logger.info(dest);
String newPath =null;
if (picture!=null){
try {
newPath= getNewFileName(uploadPath,picture.getOriginalFilename());
Files.copy(picture.getInputStream(),Paths.get(sc.getRealPath(newPath)),REPLACE_EXISTING);
// 把picture 路径放在model中还是不能立即显示图片,因为图片复制需要一定时间,可能请求介绍图片还是没有复制完,所以jsp中不能实时显示图片
model.addAttribute("picture",newPath);
} catch (Exception e) {
logger.error("upload fail",e);
}
}
return "hello";
}
private void creatFileDir(ServletContext sc, String uploadPath) {
if (uploadPath!=null){
File src = new File(sc.getRealPath(uploadPath));
if (!src.exists())
src.mkdirs();
}
}
private String getNewFileName(String uploadPath, String originalFilename) {
String extend = originalFilename.substring(originalFilename.lastIndexOf("."));
return uploadPath+"/"+new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss_SSS").format(new Date())+extend;
}
}
4. 遇到的问题
4.1 图片资源无法获取
因为web.xml中设置的拦截路径为
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
会拦截除jsp之外的一切文件包括静态资源,所以需要配置defaultServlet
处理静态资源,于是新增配置文件MyConfigAdapter
感谢大神——>Spring mvc请求处理流程详解(一)之视图解析
@Configuration
@EnableWebMvc
public class MyConfigAdapter implements WebMvcConfigurer {
// 启用DefaultServlet
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// 不拦截js目录下的文件
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
}
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(true)
.ignoreAcceptHeader(true)
.parameterName("mediaType")
.defaultContentType(MediaType.TEXT_HTML)
.mediaType("html", MediaType.TEXT_HTML)
.mediaType("json", MediaType.APPLICATION_JSON);
}
}