有一个在嵌入式 Jetty 容器中运行的 Spring Rest 应用程序。 在客户端我使用 RestTemplate(尝试)。
用例:
有一个 InputStream(我没有文件),我想将它发送到 REST 服务。
InputStream 可能非常大(没有 byte[] !)。
到目前为止我尝试了什么:
将 StandardServletMultipartResolver 添加到 Dispatcher 上下文;
在执行 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) 中,Part part 参数在处理程序方法中正确注入(inject)。
delete() 方法不会删除文件(smth 仍然有打开的句柄)。
反正看起来很丑。
有没有更流畅的解决方案?
最佳答案
您想使用 HTTP 的 Chunked Transfer Coding .您可以通过设置 SimpleClientHttpRequestFactory.setBufferRequestBody(false)
来启用它.参见 SPR-7909 .
关于java - 如何将大输入流发送到 Spring REST 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145610/