最近项目中遇到一个文件批量上传的需求,对单个的文件、多文件或者文件夹的方式上传文件都可以满足要求,总结一下使用经验。
案例基于springBoot.
1、文件上传请求
这里postman测试了单文件和多文件的上传,同时测试了文件夹方式上传。
postman中可以选择单文件或者Ctrl键选择多文件上传。如下图:
简单html实现文件夹方式的文件上传示例:
<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>文件上传</title></head><body><h1>文件上传</h1><formaction="http://localhost:8888/hello"enctype="multipart/form-data"method="post"><inputtype="hidden"name="type"value="1"/><inputtype="hidden"name="readFileType"value="jpg"/><inputid="dir"type="file"name="file"webkitdirectorymozdirectory/><inputid="uploadDir"type="submit"value="提交文件夹"></form></body></html>
2、编写配置类,springboot默认使用的是StandardServletMultipartResolver来处理Multipart,对应的使用StandardMultipartFile来接收文件数据,但是StandardMultipartFile获取的文件名如果是中文的话,总是乱码。
这里使用CommonMultiPart。
@ConfigurationpublicclassMultipartConfiguration{@Bean(name ="multipartResolver")publicCommonsMultipartResolvergetCommonsMultipartResolver(){CommonsMultipartResolver multipartResolver =newCommonsMultipartResolver();
multipartResolver.setMaxUploadSize(524288000);
multipartResolver.setMaxInMemorySize(524288000);return multipartResolver;}}
并且在启动类上排除自动配置MultipartAutoConfiguration
@EnableAutoConfiguration(exclude ={MultipartAutoConfiguration.class})
3、控制层
@Api(value ="数据接入", tags ="数据导入")@RestController@RequestMapping("/hello 这里写自己的请求")publicclassOfflineDataController{@ApiOperation(value ="数据批量上传")@AopLog(title ="数据批量上传")@RequestMapping(value ="uploadBatch", method =RequestMethod.POST)publicObjectuploadBatch(HelloVo helloVo){ResultMap resultMap = offlineDataService.uploadBatch(helloVo);return resultMap;}}
4、数据传输对象,其实就只要把file定义为一个集合就可以了,这样上传的所有文件都会封装到这里。
@Data@Builder@AllArgsConstructor@NoArgsConstructor@ApiModel("com.sjg.HelloVo")publicclassHelloVoimplementsSerializable{@ApiModelProperty("导入多个文件")privateList<MultipartFile> file;@ApiModelProperty("read文件类型")privateString readFileType;@ApiModelProperty("数据相关性")privateString relation;}
5、服务层实现类
不需要对文件上传的绝对路径进行递归处理,直接就获取文件名称,使用上传等处理即可。干就完了!
@ServicepublicclassOfflineDataServiceImplimplementsOfflineDataService{@OverridepublicResultMapuploadBatch(HelloVo helloVo){//获取所有文件List<MultipartFile> files = helloVo.getFile();//中间的其他处理过程for(MultipartFile file : files){String name ="";//取得当前上传文件的文件名称
name = file.getOriginalFilename();String fileName = name ==null?"": name.split("\\.")[0];//校验上传文件后缀是否与所选择的文件类型相同String fileSuffix = name ==null?"": name.split("\\.")[1];}//。。。其他处理并返回returnResultMap.ok("导入成功!");}}
可能的问题:上传文件有大小限制,在application.yml中配置
spring:servlet:multipart:# 设置单个文件的大小max-file-size: 100MB
# 总上传文件大小max-request-size: 500MB
选择文件夹上传文件即可
不足之处,各位大佬评论指出,感谢!
版权归原作者 乐七_ 所有, 如有侵权,请联系我们删除。