生产者:
@ApiOperation(value = "切块上传", notes = "切块上传")
@PostMapping("/uploadChunk")
public Result uploadChunk( HttpServletRequest request,ChunkBO chunkBO,MergeFileBO mergeFileBO
) throws Exception {
LOGGER.info("==========chunk " + chunkBO.getChunk());
//1、校验参数,校验文件格式是否合法,创建空文件
Chunk chunk = BeanUtil.convertBean(chunkBO, Chunk.class);
chunk.setUserId("admin");
chunk.setUserName("admin");
chunk.setUuid(mergeFileBO.getUuid());
chunk.setFileId(mergeFileBO.getFileId());
chunk.setName(mergeFileBO.getFileName());
chunk.setSize(mergeFileBO.getTotalSize());
chunk.setCurrentSize(chunkBO.getSize());
chunk.setFileMD5(mergeFileBO.getFileMD5());
Part part = request.getPart("file");
InputStream inputStream = part.getInputStream();
chunk.setInputStream(inputStream);
chunk.setFileType(part.getContentType());
System.out.println("========uuid="+chunk.getUuid());
‘’‘’
}
生产者这边的接口是参数分别是HttpServletRequest ,ChunkBO ,MergeFileBO
这三个参数,从 Part part = request.getPart("file")
看出文件已经封装到了HttpServletRequest
请求对象中。
消费者:
消费者这边按照平时的restful风格来调用的话就会:
@FeignClient(name = "filesys-service-provider1", url = "${image.show.host}", path = "/filesys-perpc")
public interface SeaWeedsImageUploadClient {
@PostMapping(value = "/uploadChunk", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result<Long> uploadChunk(@RequestPart("file") MultipartFile file,ChunkBO chunkBO,MergeFileBO mergeFileBO);
}
这样来调用,但是这样调用Feign会报java.lang.IllegalStateException: Method has too many Body parameters
这样的错误,由于是多个对象所以也不能使用@RequestBody
注解,而且生产者那边也没有使用RequestBody
来接收参数,所以肯定不能用@RequestBody
注解。
解决方案:
@FeignClient(name = "filesys-service-provider1", url = "${image.show.host}", path = "/filesys-perpc")
public interface SeaWeedsImageUploadClient {
@PostMapping(value = "/uploadChunk", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result<Long> uploadChunk(@RequestPart("file") MultipartFile file,@SpringQueryMap ChunkBO chunkBO,@SpringQueryMap MergeFileBO mergeFileBO);
}
@SpringQueryMap
:可以封装在对象里面的参数,自动解析成类似于@RequestParam
的方式,将参数跟在url后面;