有些需求需要在后端把文件转换成MultipartFile然后再请求上传接口,通过查看MultipartFile接口源码,发现其实现类有两个:CommonsMultipartFile、MockMultipartFile.
由于MockMultipartFile在spring-test包,用于测试,所以这里用CommonsMultipartFile
来构造MultipartFile。
CommonsMultipartFile:
public class CommonsMultipartFile implements MultipartFile, Serializable {
protected static final Log logger = LogFactory.getLog(CommonsMultipartFile.class);
private final FileItem fileItem;
private final long size;
private boolean preserveFilename = false;
}
构造CommonsMultipartFile主要是构造里面的FileItem。代码如下:
public class MultipartFileUtil {
private static final Logger log = LoggerFactory.getLogger(MultipartFileUtil.class);
private MultipartFileUtil() { }
public static MultipartFile toMultipartFile(byte[] bytes, String fileName) {
final FileItem fileItem = createFileItem(new ByteArrayInputStream(bytes), fileName);
return new CommonsMultipartFile(fileItem);
}
private static FileItem createFileItem(InputStream is, String fileName) {
return createFileItem(is, "file", fileName);
}
private static FileItem createFileItem(InputStream is, String fieldName, String fileName) {
final DiskFileItemFactory fac = new DiskFileItemFactory(10240, null);
FileItem fileItem = fac.createItem(fieldName, "multipart/form-data", true, fileName);
final OutputStream fileItemOutStream;
try {
fileItemOutStream = fileItem.getOutputStream();
} catch (IOException e) {
log.error("获取FileItem输出流异常:{}", e.getMessage(), e);
throw new ServiceException("系统异常");
}
try {
IOUtils.copy(is, fileItemOutStream);
} catch (IOException e) {
log.error("写入FileItem异常:{}", e.getMessage(), e);
throw new ServiceException("系统异常");
}
return fileItem;
}
}