java - 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 中有关在关闭 InputStream 时删除文件的早期线程。
推荐阅读
- sockets - 如果我发送一些数据然后立即关闭套接字,另一端会收到数据吗?
- excel - 列出所有具有搜索条件的字段
- python-3.x - Discord.py 无需命令即可访问 bot 所有服务器中的所有成员?
- logistic-regression - 如何解码 spark ml 中的一个热编码器值
- c++ - 图数据库/C++ 连接
- shell - 如何在 Oozie 工作流程中使用依赖项?
- prettier - 更漂亮 - 如何删除将所有内容放在新行上的规则?
- python - 将参数传递给 python lambda 会产生意外的输出
- javascript - 使用 Javascript 将具有动态变量的对象键值转换为 HTML
- camera - 条码类应用