feign.FeignException: status 400 reading
UploadClient#upload(MultipartFile,String);
- 经debug,发现MultipartFile没有传入文件上传微服务
- 查资料,各种要配置Feign的configuration的,都没起效;
- 查到MutipartFile的fieldName一定要与feign调用处定义的value一致
- 问题:我的feign调用处没有value,因为我的MultipartFile在自定义对象里,即controller层不是
@RequestParam("file") MultipartFile
- 解决方法
- 不晓得有没有注解可以直接到自定义类里面,快速声明MultipartFile的value
- 手动更改MultipartFile的fieldName
总结
- Feign接口
@FeignClient(name = "FILE")
//@Component
public interface FileFeign {
@PostMapping(value = "/file/upload", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public Result upload(@RequestPart(value = "file") MultipartFile file, @RequestHeader String token);
}
- 手动在调用处将MultipartFile的FieldName更改
/*
更改FieldName为'file'
*/
public MultipartFile preMultipartFile(MultipartFile multipartFile) {
MultipartFile resFile = null;
try {
InputStream fileIps = multipartFile.getInputStream();
//将File的名称设置为原multipartFile的文件名称(文件上传微服务需要)
File multoFile = new File(multipartFile.getOriginalFilename());
inputStreamToFile(fileIps, multoFile);
//File转化为FileItem
FileItem fileItem = createFileItem(multoFile, multipartFile.getOriginalFilename());
fileIps.close();
fileItem.setFieldName("file");
resFile = new CommonsMultipartFile(fileItem);
} catch (IOException e) {
e.printStackTrace();
}
return resFile;
}
/*
创建FileItem
*/
private FileItem createFileItem(File file, String fieldName) {
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item = factory.createItem(fieldName, "text/plain", true, file.getName());
int bytesRead = 0;
byte[] buffer = new byte[8192];
try {
FileInputStream fis = new FileInputStream(file);
OutputStream os = item.getOutputStream();
while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return item;
}
/**
* 输入流转File类型
* @param ins
* @param file
*/
public static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}