最近项目种遇到一个场景,再调用http接口的时候,请求体需要用文件流,当时百度了很多帖子,发现基本全都是以下这种方法:
private InputStream convertPdf(MultipartFile multipartFile) throws IOException {
File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
FileSystemResource resource = new FileSystemResource(file);
MultiValueMap<String, Object> params = new LinkedMultiValueMap();
params.add("file", resource);
params.add("dstFormat", "pdf");
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Resource> entity = restTemplate.postForEntity(convertPdfUrl, params, Resource.class);
InputStream ins = Objects.requireNonNull(entity.getBody()).getInputStream();
return ins;
}
搜了很多发现千篇一律是这种,但是我目前的需求场景需要脱离File,直接使用流,因为我的输入流是从ftp服务器所获取的,于是自己尝试用byte[]作为实体,发现成功有效:
public void handEvent(String fileName) {
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
InputStream inputStream = null;
//下载文件
inputStream = ftpUtil.downloadFIle(fileName);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int temp;
while ((temp = inputStream.read(bytes)) != -1) {
byteArrayOutputStream.write(bytes, 0, temp);
}
//文件流转byte[]
byte[] by = byteArrayOutputStream.toByteArray();
String url = "http://xxxxx";
HttpEntity<byte[]> httpEntity = new HttpEntity<>(by, headers);
HttpEntity<String> result = restTemplate.exchange(url, HttpMethod.PUT, httpEntity, String.class);
log.info("--------上传结果:{}", result);
} catch (IOException e) {
e.printStackTrace();
}
}