一、对于单个文件上传
@RequestMapping(method = ,consumes = MediaType.MULTIPART_FORM_DATA_VALUE,value = "/file/upload")
ResponseVO<UploadFileVO> upload(@RequestPart MultipartFile picFile,@RequestParam Integer count,@RequestParam String type,@RequestParam String service);
File image1 = new File(imagePath1);
MockMultipartFile imageMultiFile1 = new MockMultipartFile((),new FileInputStream(image1));
ResponseVO<UploadFileVO> imageResponse1 = (imageMultiFile1,1,"file","upload");
@RequestPart主要用来处理content-type为 multipart/form-data 或 multipart/mixed stream 发起的请求,可以获取请求中的参数,包括普通文本、文件或复杂对象比如json、xml等,针对json等复杂对象。
@RequestParam也同样支持multipart/form-data请求,@RequestParam适用于name-value String类型的请求,@RequestPart适用于复杂的请求域(像JSON,XML)
上例中的@RequestParam参数可以通过以下方法获取
String type = ("type");
二、对于多个文件上传
2.1、多文件编码解析,重写encode方法,处理多文件
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @Author: nzy
* @Description:
* @Date:Create:in 2022/8/5 10:27
* @Modified By:
*/
public class SpringMultipartEncoder extends SpringFormEncoder {
public SpringMultipartEncoder() {
this(new Default());
}
public SpringMultipartEncoder(Encoder delegate) {
super(delegate);
MultipartFormContentProcessor processor = (MultipartFormContentProcessor) getContentProcessor();
(new SpringSingleMultipartFileWriter());
(new SpringManyMultipartFilesWriter());
}
@Override
public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
if (bodyType != null && ()) {
MultipartFile file = (MultipartFile) object;
if (file != null) {
Map<String, Object> data = ((), object);
(data, MAP_STRING_WILDCARD, template);
return;
}
} else if (bodyType != null && (MultipartFile[].class)) {
if(object!=null) {
MultipartFile[] files = (MultipartFile[]) ((MultipartFile[]) object);
Map<String, MultipartFile> data = new HashMap<>();
for(int i=1;i<=;i++) {
("file"+i,files[i-1]);
}
(data, MAP_STRING_WILDCARD, template);
return;
}
}
(object, bodyType, template);
}
}
2.2、config配置文件
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @Author: nzy
* @Description:
* @Date:Create:in 2022/8/5 10:27
* @Modified By:
*/
@Configurable
public class MultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder() {
return new SpringMultipartEncoder(new SpringEncoder(messageConverters));
}
}
2.3、在feignclient上配置configuration 属性为自定义的Encoder,这个config仅影响设置的feign
@FeignClient(value="${}",fallback = ,contextId = "dormClient",configuration = )
public interface FileClient {
@RequestMapping(method = ,consumes = MediaType.MULTIPART_FORM_DATA_VALUE,value = "/file/upload")
ResponseVO<UploadFileVO> upload(@RequestPart MultipartFile[] picFile,@RequestParam Integer count,@RequestParam String type,@RequestParam String service);
}
2.4、使用
MockMultipartFile imageMultiFile1 = new MockMultipartFile((),(),null,new FileInputStream(image1));
MockMultipartFile imageMultiFile2 = new MockMultipartFile((),(),null,new FileInputStream(image2));
MockMultipartFile multiFile1 = new MockMultipartFile((),(),null,new FileInputStream(file1));
MockMultipartFile multiFile2 = new MockMultipartFile((),(),null,new FileInputStream(file2));
MockMultipartFile[] mockMultipartFiles = new MockMultipartFile[]{imageMultiFile1,imageMultiFile2,multiFile1,multiFile2};
ResponseVO<UploadFileVO> fileResponse = (mockMultipartFiles,4,"file","upload");
("文件上传结果:{}",fileResponse);
2.5、file接收文件服务:
@RestController
@RequestMapping(value = "/file")
@Slf4j
public class UploadFileController {
@PostMapping(value = "/upload")
public ResponseVO<UploadFileVO> upload(HttpServletRequest request) {
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
String type = ("type");
Integer count = ("count");
for(int i=1;i<=count;i++) {
MultipartFile mf = ("file" + i);
}
}
}