Feign 发送对象,对象含多个文件
Feign在发送文件时,可以使用Feign-form。
另一种方式,关键就是,要将文件转成Resource,然后使用Spring的MultivalueMap
本次发送的是个对象,对象里含有 文件对象数组Multipartfile[]
前台是将 键值对和 文件都放到formdata里去。
发送前,将文件对象数组和属性都取出,放入multivaluemap,文件转成bytearrayresource
接收方,spring可以自动识别。
但是需要注意的是,接收方如果把multipartfile直接返回回来,是识别不了的,所以建议在接收方把 file属性进行序列化忽略。另外(该方式没有测试,不知道是否可行)或许可以把文件像调用方那样转成resource试试
$(document).on('click','.submit',function () { var formData = new FormData(); let arr = $("#rating").serializeArray(); $(arr).each(function () { let name = this.name; let value = this.value; formData.append(name,value); }); let eachEnd = true; $(".fj-ul li").each(function () { let $li = $(this); let fileid = $li.data("fileid"); if(isNull(fileid)){ let file = $li.data("file"); if (file.size == 0) { utils.alerter.show("文件大小是0,不可上传"); eachEnd = false; return eachEnd; } //10M if (file.size > 10 * 1024 * 1024) { utils.alerter.show("文件不可超过10MB"); eachEnd = false; return eachEnd; } formData.append("files",file); } }); if(eachEnd){ $.ajax({ url:'save', type:'post', data: formData, processData: false, contentType: false, success:function (result) { if(result.isok){ } utils.alerter.show(result.msg); }, error:function () { utils.alerter.show("请求失败"); } }); } });
对象:截图部分字段
调用方
/** * 保存 * @param rating * @return */ @PostMapping("/save") @ResponseBody public ApiResult<BoCrmCusRating> save(BoCrmCusRating rating,HttpSession session){ String loginname = (String) session.getAttribute(SSOLoginInterceptor.LOGINNAME); if(rating.getId()==null){ rating.setCreateUser(loginname); }else{ rating.setUpdateUser(loginname); } try { MultiValueMap map = beanToMultiMap(rating); return cusRatingFeign.save(map); } catch (Exception e) { logger.error("",e); return ApiResult.failResult("失败:"+e.getMessage()); } } /** * bean to map * @param t * @param <T> * @return * @throws IllegalAccessException */ private static <T> MultiValueMap beanToMultiMap(T t) throws Exception { MultiValueMap<String,Object> map = new LinkedMultiValueMap<>(); Class<?> clazz = t.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object o = field.get(t); if(!field.getName().equals("files")){ map.add(field.getName(), o); }else{ MultipartFile[] files = (MultipartFile[]) o; for (MultipartFile file : files) { ByteArrayResource resource = new ByteArrayResource(file.getBytes()){ @Override public String getFilename() { try { return URLEncoder.encode(file.getOriginalFilename(),"UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage()); } } }; map.add("files",resource); } } } return map; }
/** * 保存 * @return */ @RequestMapping(value = "/save",method = RequestMethod.POST,consumes = MediaType.MULTIPART_FORM_DATA_VALUE) ApiResult<BoCrmCusRating> save(MultiValueMap map);
接收方
/** * 保存 * @return */ @PostMapping("/save") public ApiResult<BoCrmCusRating> save(BoCrmCusRating rating){ return cusRatingService.save(rating); }