首页 > 解决方案 > Spring @RestController - 服务请求后

问题描述

背景

这是@RestController 中定义的方法,它从磁盘读取文件然后流回。

@RequestMapping(value = "/bill", method = RequestMethod.GET)
public ResponseEntity<Object> getbill(){
  ...
  InputStream in = new FileInputStream(file);
  InputStreamResource inputStreamResource = new InputStreamResource(in);
  httpHeaders.setContentLength(file.Length());
  return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);
}

问题

我想在请求服务后删除文件,但找不到好地方。

我认为应该是在 inputStream 关​​闭之后(https://github.com/spring-projects/spring-framework/blob/v4.3.9.RELEASE/spring-web/src/main/java/org/springframework/http /converter/ResourceHttpMessageConverter.java#L117 ) 。由于文件是由 Inputstream 打开的,因此无法在上述方法中完成。

答案摘要 感谢大家对此的帮助。

接受的答案需要最少的更改并且运行良好。

标签: javaspringspring-restcontroller

解决方案


除了在 RESTfull 服务中对 GET 请求执行破坏性操作是不好的做法之外,默认 Java 库无法做到这一点。更广泛接受的实现是 GET 流式传输文件,然后调用 DELETE 删除文件。

但是您可以通过实现自己的 InputStream 来做到这一点,请参阅 Stackoverflow 中有关在关闭 InputStream 时删除文件的早期线程。


推荐阅读