java - Play 框架中文件下载完成时的通知

标签 java playframework playframework-1.x

我成功地使用 Play 1.2.4 为使用 renderBinary() 方法的用户提供大型二进制文件下载服务。

我想得到用户实际完成下载的提示。一般来说,我知道这是有可能的,因为我以前做过。在我网站的旧版本中,我编写了一个简单的 servlet 来提供二进制文件下载。一旦该 servlet 写完文件的内容,就会发送一个通知。当然不完美,但仍然有用。在我的测试中,它确实提供了用户下载文件所用时间的指示。

查看 Play 源代码,我看到 play.mvc.results.RenderBinary 类有一个我可以使用的方便的 apply() 方法。我编写了自己的 RenderBinary 版本,这样我就可以在 apply() 方法写完文件内容后发送通知。

我发现的问题是对 response.out.write() 的调用显然缓存了传出字节(通过 Netty?),所以即使我正在写出几兆字节的数据,对 play.mvc.Http 的调用。 Response.out.write() 在几秒钟内完成,即使下载程序需要几分钟才能下载文件。

我不介意编写自定义类,尽管我更愿意使用现有的 Play 1.2.4 发行版。

关于如何在文件下载结束推送到用户浏览器时获得通知的任何想法?

最佳答案

这似乎对您有所帮助,因为它解决了某种类似的问题:

Detect when browser receives file download

我不确定您能否通过 Controller 中的 renderBinary@After 注释来完成此操作。一些浏览器端的下载检测然后向服务器发出通知(ping 下载结束)会起作用。

可能有另一种选择:使用 WebSockets(通过套接字流式传输文件,然后让客户端回答)但这可能有点矫枉过正 :)

关于java - Play 框架中文件下载完成时的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10300523/

相关文章:

java - StringBuilder 类似PreparedStatement

java - 完成父类的申请

hibernate - 多对一级联不起作用

playframework - Play 2.6 和 Ebean 的多数据库源不起作用

java - java中获取磁盘的唯一标识符

java - 将 C++ OpenGL 转换为 Java/LWJGL

java - 玩!验证不起作用

mysql - 将 Play Framework @ManyToOne 关系链接到 MySQL 中的外键

java - Play 2.0 与 Play 1.2.5-RC1 + CRUD + 其他模块

java - 播放框架 1.2.5 : OutOfMemoryError occured : Java heap space in play framework