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