file 转换MultipartFile

因为工作中的业务需要,需要将file转换为Spring专有的MultipartFile。

    • 过程
    • 结论

过程

spring通过MultipartFile来实现文件上传,查看相关的源码后,会发现原理十分简单。
首先,打开MultipartFile,发现这是一个接口,其中定义了一些关于file的处理方法。

file 转换MultipartFile_第1张图片

看到此接口的实现类有如下几个,分别来看一下。
file 转换MultipartFile_第2张图片

  • 打开StandardMultipartFile,发现这是一个私有内部类,外部类是StandardMultipartHttpServletRequest。然看查看相关调用代码,发现MultipartFile的基本作用,将request中的file封装为StandardMultipartFile,用于后续处理。
    file 转换MultipartFile_第3张图片
  • 然后是CommonsMultipartFile,这个类有没有很熟悉?在spring中需要对上传文件大小进行限制时,可以通过在配置文件中对CommonsMultipartFileResolve Bean相关属性进行注入来设置。打开CommonsMultipartFileResolve源码,也确实发现是通过CommonsMultipartFile来处理的。spring Web默认使用CommonsMultipartFile来处理文件上传。
    这里写图片描述
//CommonsFileUploadSupport 是CommonsMultipartResolver的抽象父类
//spring Web默认使用CommonsMultipartFile来处理文件上传
public abstract class CommonsFileUploadSupport {
    protected MultipartParsingResult parseFileItems(List fileItems, String encoding) {
        for (FileItem fileItem : fileItems) {
                if (fileItem.isFormField()) {
                    //无关代码省略
                } else {
                    // multipart file field
                    CommonsMultipartFile file = new CommonsMultipartFile(fileItem);
                    multipartFiles.add(file.getName(), file);
                }
            }
        }
    }
}
  • 列表内容最后看一下MockMultipartFile,发现在spring-test Jar包中,是对MultipartFile的一个简单实现。

结论

MultipartFile是spring中定义的一个接口,file是无法转换为multipartfile的。但是可以定义一个具体类,并实现MultipartFile,用具体类将file进行封装,将file封装为MultipartFile。
如果系统中有spring-test jar包,则可以直接使用MockMultipartFile。

你可能感兴趣的:(spring)