java - 如何向 spring REST服务发送大的输入流?

  显示原文与译文双语对照的内容

在嵌入式Jetty容器中运行 spring Rest应用程序。 在客户端我使用 RestTemplate ( 尝试) 。

用例:

我想把一个 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仍在它的上打开句柄) 进行 delete 处理。

反正看起来很难看。

是否有更光滑的解决方案?

时间: 作者:

你希望使用http块传输代码的 你可以通过设置来启用SimpleClientHttpRequestFactory.setBufferRequestBody(false) 。请参见 SPR-7909.

作者:

你应该使用字节 [],并围绕web服务编写一个包装器以实际发送"大字符串"。 在web服务器中添加一个参数,该参数指示内容的"contentid",这样另一端知道该部分属于哪个"桶"。 另一个参数"chunkId"有助于在另一侧的块序列中进行排序。 如果你发送的是 final,那么第三个参数 finally 将被设置为"isfinalchunk"。 这是在少于 100行代码中实现的高级功能。

这个问题的唯一问题是,你将"n"调用而不仅仅是一个调用,将连接延迟 等等 用于实时。

我认为这很简单,一旦你有了自己的类包装器,它就可以很容易地处理多个web服务。

...