Php 如何在浏览器中中断(因错误而停止)基于流的下载

Php 如何在浏览器中中断(因错误而停止)基于流的下载,php,http,browser,streaming,silex,Php,Http,Browser,Streaming,Silex,在我们的应用程序(PHP)中,用户可以下载文件,这些文件的内容基于数据库中的数据。这些数据可能非常大(gigs),所以我们在生成流文件(包括处理数据)时立即开始流文件。因此,我们无法设置内容长度,因为我们还不知道它。当然,有些例外是可能的,首先是db(确切地说是mongo)超时或连接丢失,或者是数据到内容处理中的某些情况,或者是smth等。现在,如果出现异常,从用户的角度来看,下载就会停止(就好像它完成了一样)。这对我们来说是非常不愉快的,因为用户可能认为下载是成功的,但实际上该文件包含1000

在我们的应用程序(PHP)中,用户可以下载文件,这些文件的内容基于数据库中的数据。这些数据可能非常大(gigs),所以我们在生成流文件(包括处理数据)时立即开始流文件。因此,我们无法设置内容长度,因为我们还不知道它。当然,有些例外是可能的,首先是db(确切地说是mongo)超时或连接丢失,或者是数据到内容处理中的某些情况,或者是smth等。现在,如果出现异常,从用户的角度来看,下载就会停止(就好像它完成了一样)。这对我们来说是非常不愉快的,因为用户可能认为下载是成功的,但实际上该文件包含10000行而不是20000行。因此,我们希望以这样的方式中断流,即浏览器在下载时会显示“错误”。目前,流式处理是由Silex处理的,正如docs()中所描述的那样,但如果有必要,我们不能切换任何原生php工具。谷歌搜索还没起到多大作用,但我可能用错了关键词。所以问题是:有可能吗?如果有,怎么可能?语言是第二种情况,我认为,这里最重要的是一种通用的方法,即http。

您应该发送一个
内容长度
头,以便浏览器可以确定下载是否成功。我不知道内容长度,因为文件是同时生成和传输的。我只能大概猜到,但这似乎是最后一个解决办法。与其直接流式处理,不如先保存文件,然后再流式处理。流媒体处理完成后,您可以随时删除该文件。我想我的描述不好。这些文件可能非常大。例如,几千兆字节。我们不能预先存储这些文件(请相信我),让用户等待,而我们生成的巨大文件,然后才开始流式传输,这是不可能的。用户单击“下载”并希望立即开始下载。如果您既不能保存文件,也不知道文件的大小,浏览器无法判断下载是否成功。您应该发送
内容长度
标题,这样浏览器就可以确定下载是否成功。我不知道内容长度,因为文件是同时生成和传输的。我只能大概猜到,但这似乎是最后一个解决办法。与其直接流式处理,不如先保存文件,然后再流式处理。流媒体处理完成后,您可以随时删除该文件。我想我的描述不好。这些文件可能非常大。例如,几千兆字节。我们不能预先存储这些文件(请相信我),让用户等待,而我们生成的巨大文件,然后才开始流式传输,这是不可能的。用户单击“下载”并希望立即开始下载。如果您既不能保存文件,也不知道文件的大小,浏览器无法判断下载是否成功。