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); }