在播放框架中发送大文件时如何捕获客户端断开连接?
Posted
技术标签:
【中文标题】在播放框架中发送大文件时如何捕获客户端断开连接?【英文标题】:How to catch a client disconnection when sending a large file in play framework? 【发布时间】:2017-07-16 16:25:11 【问题描述】:我正在发送一个正在播放的文件应用程序响应。当客户端下载文件时,我正在从本地服务器清理文件。我正在使用以下代码实现这一点:
val fileToServe = TemporaryFile(new File(fileName))
Ok.sendFile(fileToServe.file, onClose = () => fileToServe.clean )
但是当客户端断开连接时,临时文件仍保留在本地服务器中。但我想处理这种断开连接并清理 临时文件。我听说过 onDoneEnumerating() 但无法使用它。
谁能指出处理断开连接并从本地服务器清理临时文件的最简单方法?
【问题讨论】:
为什么不跟踪影响所有连接的每个临时资源?比如连接池? 请多多指教 这是我过去经常做的事情:每当收到连接时,我都会将连接存储在所有连接所在的全局对象中。使用字典,我将它们使用或分配的资源与每个连接相关联。在断开连接时,很容易抓取已使用的资源并对这些资源采取适当的操作。至于“如何检测”断开连接,我不知道你的框架。但这是基本的,所以我猜它已经实现了;-) 在游戏框架中,我找不到任何东西来捕捉断开连接。这是我的实际查询。 Play 中的 TemporaryFile 包含对文件系统上实际文件的引用,并在垃圾收集时将其清除。您可以尝试研究为什么实例没有被 GC 销毁。请记住,垃圾收集器不能保证立即运行。 【参考方案1】:TemporaryFile 用于当 Play 接收到必须保存在临时文件位置的数据流时,而不是您将文件发送出去。它在最终确定(2.6 之前)或幻像文件引用(2.6.x)时删除。
捕获断开连接的最简单方法是调用 Files.deleteIfExists
https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#deleteIfExists-java.nio.file.Path-
在 onClose 块中。如果由于某种原因这似乎不起作用,您可以使用临时文件收割器:
https://www.playframework.com/documentation/2.6.x/ScalaFileUpload#Cleaning-up-temporary-files
这会经常清理临时文件目录。
【讨论】:
以上是关于在播放框架中发送大文件时如何捕获客户端断开连接?的主要内容,如果未能解决你的问题,请参考以下文章