springboot上传文件总结

      MultipartResolver用于处理文件上传,当收到请求时DispatcherServlet的checkMultipart()方法会调用MultipartResolver的isMultipart()方法判断请求中是否包含文件。如果请求数据中包含文件,则调用MultipartResolver的resolveMultipart()方法对请求的数据进行解析,然后将文件数据解析成MultipartFile并封装在MultipartHttpServletRequest(继承了HttpServletRequest)对象中,最后传递给Controller。
在MultipartResolver接口中有如下方法:
boolean isMultipart(HttpServletRequest request); // 是否是 multipart
MultipartHttpServletRequest resolveMultipart(HttpServletRequest request); // 解析请求
void cleanupMultipart(MultipartHttpServletRequest request);

        MultipartFile封装了请求数据中的文件,此时这个文件存储在内存中或临时的磁盘文件中,需要将其转存到一个合适的位置,因为请求结束后临时存储将被清空。
在MultipartFile接口中有如下方法:
String getName(); // 获取参数的名称
String getOriginalFilename(); // 获取文件的原名称
String getContentType(); // 文件内容的类型
boolean isEmpty(); // 文件是否为空
long getSize(); // 文件大小
byte[] getBytes(); // 将文件内容以字节数组的形式返回
InputStream getInputStream(); // 将文件内容以输入流的形式返回
void transferTo(File dest); // 将文件内容传输到指定文件中

   MultipartResolver是一个接口,它的实现类如下图所示,分为CommonsMultipartResolver类和StandardServletMultipartResolver类。CommonsMultipartResolver使用commons Fileupload来处理multipart请求,所以在使用时,必须要引入相应的jar包;而StandardServletMultipartResolver是基于Servlet 3.0来处理multipart请求的,所以不需要引用其他jar包,但是必须使用支持Servlet 3.0的容器才可以。
 

1、StandardServletMultipartResolver

如果没配置CommonsMultipartResolver,则StandardServletMultipartResolver为默认处理类。

文件上传相关参数配置:

#单个上传文件大小
spring.http.multipart.max-file-size=20Mb
#一次上传总大小
spring.http.multipart.max-request-size=1024Mb
#临时文件保存目录
spring.http.multipart.location=

后台获取文件:

    @RequestMapping("insert")
    public ModelAndView insert(@RequestParam("files")MultipartFile[] files,
                               @RequestParam(value="position" ,required =true)String[] position) throws Exception {
        logger.debug("==================start=========================");
        logger.info("文件个数:" + files.length + ";position=" + position.length);
        if (files.length > 0){
            MultipartFile multipartFile = files[0];
            String fileName = multipartFile.getOriginalFilename();
            File saveFile = new File(configProperties.getFileSaveRootPath(), fileName);
            FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), saveFile);
//            multipartFile.transferTo(saveFile);
        }

        ModelAndView mv = new ModelAndView("advertisement/advertisementList");
        logger.debug("===============end====================");
        return mv;
    }

如果调用transferTo方法,则会保存到临时文件中。如果没配置spring.http.multipart.location参数(或者配置为""时),则会保存到系统临时目录,此时可能报错:

java.io.FileNotFoundException C:\\Users\\user\\AppData\\Local\\Temp\\jetty-0.0.0.0-8190-store_partner_server.war-_mp_store-any-7741909446468459009.dir\\D:\\jetty\\jetty-9.2.25\\webapps\\data\\1a535751-bcad-4a49-bec2-517a1742b84f.jpg (文件名、目录名或卷标语法不正确。)

2、CommonsMultipartResolver

增加依赖jar包:

<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.1</version>
</dependency>

SpringbootApplication中增加配置:

@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver(){
   CommonsMultipartResolver resolver = new CommonsMultipartResolver();
   resolver.setDefaultEncoding("UTF-8");
   resolver.setResolveLazily(true);//resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
   resolver.setMaxInMemorySize(40960);//设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240
   resolver.setMaxUploadSize(20*1024*1024);//上传文件大小 50M 50*1024*1024
   return resolver;
}

同时SpringbootApplication注解增加@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})//exclude表示自动配置时不包括Multipart配置。

如果不使用该注解,则会由于springboot自带的org.springframework.web.multipart.MultipartFile和Multipart冲突导致后台通过(@RequestParam("files")MultipartFile[] files)获取的文件为null。或者同通过(@RequestParam("files")CommonsMultipartFile[] files)获取时错误:Required CommonsMultipartFile[] parameter 'files' is not present

后台获取文件:

@RequestMapping("insert")
public ModelAndView insert(@RequestParam("files")CommonsMultipartFile[] files,
                           @RequestParam(value="position" ,required =true)String[] position) throws Exception {
    logger.debug("==================start=========================");
    logger.info("文件个数:" + files.length + ";position=" + position.length);
    if (files.length > 0){
        CommonsMultipartFile multipartFile = (CommonsMultipartFile)files[0];
        String fileName = multipartFile.getOriginalFilename();
        String fileName1 = multipartFile.getFileItem().getName();
        File saveFile = new File(configProperties.getFileSaveRootPath(), fileName);
        multipartFile.transferTo(saveFile);
    }
    ModelAndView mv = new ModelAndView("advertisement/advertisementList");
    logger.debug("===============end====================");
    return mv;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值