java - Spring @RestController - 请求被处理后

标签 java spring 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 打开的,因此无法在上述方法中完成。

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

接受的答案需要最少的改变并且工作良好。

最佳答案

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

但是您可以通过实现自己的 InputStream 来做到这一点,请参阅 Stackoverflow 中的早期线程 deleting files on closing a InputStream .

关于java - Spring @RestController - 请求被处理后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52646608/

相关文章:

java - Hazelcast 自定义操作超时

java - Spring Boot Rest Api 的单元测试模拟

java - Spring FeignClient : How to configure a load balancer like Ribbon

java - 将 DateTime 转换为时区,设置时间并转换回来

java - 在Java中,如何每X秒执行一次代码?

java - 为什么设置类路径后javax.servlet包仍然不存在?

java - 严重 : Could not dispatch event: Eventbus com. google.common.eventbus.SubscriberExceptionContext

java - 如何在自定义 Spring Data JPA 存储库中注入(inject)配置

java - 创建类路径资源 [jpaContext.xml] 中定义的名称为 'entityManagerFactory' 的 bean 时出错

java - 在 REST Controller 中使用 AtomicLong