Spring mvc文件上传

参考:
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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值