有一個運行在嵌入式Jetty容器內的Spring Rest應用程序。 在客戶端上,我使用RestTemplate(嘗試)。如何將大型輸入流發送到Spring REST服務?
使用案例:
有一個InputStream(我沒有文件),我想將它發送到REST服務。
InputStream可能非常大(無字節[]!)。
我試過到目前爲止:
新增StandardServletMultipartResolver給調度上下文;
在servlet的註冊執行:
ServletRegistration.Dynamic dispatcher = ...
MultipartConfigElement multipartConfigElement = new MultipartConfigElement("D:/temp");
dispatcher.setMultipartConfig(multipartConfigElement);
在客戶端:
restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
parts.add("attachmentData", new InputStreamResource(data) {
// hacks ...
@Override
public String getFilename() {
//avoid null file name
return "attachment.zip";
}
@Override
public long contentLength() throws IOException {
// avoid calling getInputStream() twice
return -1L;
}
}
ResponseEntity<Att> saved = restTemplate.postForEntity(url, parts, Att.class)
在服務器:
@RequestMapping("/attachment")
public ResponseEntity<Att> saveAttachment(@RequestParam("attachmentData") javax.servlet.http.Part part) {
try {
InputStream is = part.getInputStream();
// consume is
is.close();
part.delete();
return new ResponseEntity<Att>(att, HttpStatus.CREATED);
}
}
正在發生的事情: 上傳的InputStream成功地存儲在配置臨時文件夾(MultiPart1970755229517315824),部分零件參數正確注入處理程序方法中。
delete()方法不會刪除文件(smth仍然打開了句柄)。
無論如何它看起來非常難看。
有沒有更流暢的解決方案?
'如果出現錯誤,'Part#delete()'應該拋出'IOException'。可以? –
它依次調用File#delete()並且不檢查返回值,失敗時默默無聞 – Bax