因为工作中的业务需要,需要将file转换为Spring专有的MultipartFile。
过程
spring通过MultipartFile来实现文件上传,查看相关的源码后,会发现原理十分简单。
首先,打开MultipartFile,发现这是一个接口,其中定义了一些关于file的处理方法。
看到此接口的实现类有如下几个,分别来看一下。
- 打开StandardMultipartFile,发现这是一个私有内部类,外部类是StandardMultipartHttpServletRequest。然看查看相关调用代码,发现MultipartFile的基本作用,将request中的file封装为StandardMultipartFile,用于后续处理。
- 然后是CommonsMultipartFile,这个类有没有很熟悉?在spring中需要对上传文件大小进行限制时,可以通过在配置文件中对CommonsMultipartFileResolve Bean相关属性进行注入来设置。打开CommonsMultipartFileResolve源码,也确实发现是通过CommonsMultipartFile来处理的。spring Web默认使用CommonsMultipartFile来处理文件上传。
//CommonsFileUploadSupport 是CommonsMultipartResolver的抽象父类
//spring Web默认使用CommonsMultipartFile来处理文件上传
public abstract class CommonsFileUploadSupport {
protected MultipartParsingResult parseFileItems(List<FileItem> 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。