发送文件时,应当注意文件的包装方式,错误的包装方式可能会将文件二进制流放入form-data中而无法被接收方识别并读取。
1. python
发送端为python
,接收端为python
发送端代码:
res = requests.post(self.Url_Inf,params={"type":type_species},files={'mask_img':mask_img,'mask_board':mask_board})
二进制文件数据必须放在requests.post
的files
参数中,否则接收端无法正确识别,即无法被request,files
正确读取
2.Java
Java可使用两种对象FileSystemResource
和ByteArrayResource
传输文件
2.1 FileSystemResource
HttpHeaders headers = new HttpHeaders();
MediaType mediaType = MediaType.parseMediaType("multipart/form-data");
headers.setContentType(mediaType);
File file = new File(url);
MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
form.add("image_content", new FileSystemResource(file));
form.add("select_type",kind);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(form, headers);
RecognitionResults recognitionResults = restTemplate.postForObject("http://172.17.254.23:5000/inference", httpEntity, RecognitionResults.class);
2.2 ByteArrayResource
在使用ByteArrayResource对象创建资源对象时,需要重写定义的getFilename()和contentLength()两个方法,返回文件的名称和大小信息,否则在文件流传递时无法获取到有效的文件资源而导致最终服务接收文件异常。
实测重写getFilename()
即可
public static ByteArrayResource base64ToByteArrayResource(String base64Str){
/*
必须重写getFileName方法,这样文件才会被放在请求正确的位置,可以被接收端正确的识别为接收对象,
否则文件将会被放在form-data中作为普通数据处理,从而无法被flask识别为文件对象
* */
byte[] decodedBytes = Base64.getDecoder().decode(base64Str); // 解码 base64 字符串为字节数组
return new ByteArrayResource(decodedBytes){
@Override
public String getFilename() {
return "image.jpg";
}
}; // 包装字节数组为资源对象
}