遇到一个需求,需要把文件传给第三方,调用顺序是这样的,前端->A服务->B服务->第三方接口,如果通过文件流在多个服务之间传输,肯定会带来性能问题。最终解决办法是:前端直传阿里OSS,然后传给后端URL,多个服务之间传递URL, 在B服务中,根据URL请求第三方接口。 1. 根据URL下载到本地,再用本地文件上传第三方接口。 2. 直接用FileUrlResource fileUrlResource = new FileUrlResource(new URL(fileUrl));这种方式更简洁,再放到MultiValueMap中。
@Override
public ZlResponse<ZlResult> uploadContractFile(String sourceSystem, String sourceDocumentNumber, String fileUrl) {
log.info("上传合同文件调用甄零第三方接口开始");
Map<String, Object> params = new HashMap<>();
params.put("fileType", "DOCUMENT");
params.put("sourceSystem", sourceSystem);
params.put("sourceDocumentNumber", sourceDocumentNumber);
// 截取文件名
String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
params.put("fileName", fileName);
try {
FileUrlResource fileUrlResource = new FileUrlResource(new URL(fileUrl));
params.put("file", fileUrlResource);
} catch (IOException e) {
e.printStackTrace();
}
String response = this.invokeMultipartFormData(DOMAIN + UPLOAD_FILE_URL, params, String.class);
return JSON.parseObject(response, new TypeReference<ZlResponse<ZlResult>>() {
});
}
@SuppressWarnings("unchecked")
private static <T> T invoke(HttpMethod httpMethod, String url, Map params, Map<String, String> headers, Class<T> cls) {
headers.put("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE);
MultiValueMap xMap = new LinkedMultiValueMap();
xMap.setAll(params);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setAll(headers);
HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(xMap, httpHeaders);
try {
ResponseEntity<T> responseEntity = restTemplate.exchange(url, httpMethod, httpEntity, cls, params);
if (responseEntity.getStatusCode().isError()) {
return null;
}
return responseEntity.getBody();
} catch (Exception e) {
return restTemplateErrorMsg(e);
}
}
















