我知道这是可能的,但我似乎无法弄明白。
我有一个mySQL查询,有几十万个结果。我希望能够发送结果,但似乎响应需要内容长度标题才能开始下载。
在phpMyAdmin中,如果你去导出一个数据库,它会立即开始下载,FF只是说明了未知的文件大小,但是它有效。我查看了那段代码,但无法理解。
帮助?
感谢。
答案 0 :(得分:10)
this document声明在HTTP中,只要在传输之前确定消息的长度,就应该发送它,除非4.4节中的规则禁止这样做。这意味着如果你不能说出它的大小,就不必发送它。
请勿发送。
如果要在所有数据可用之前将部分数据发送到浏览器,您刷新输出缓冲区吗?也许那是什么问题,而不是缺少标题?
你使用同花顺的方式是这样的:
所以,如果你的查询返回了很多结果,你可以生成输出,比如100或1000,然后刷新,等等。
此外,要告诉客户端浏览器尝试保存文件而不是在窗口中显示文件,您也可以尝试使用 Content-disposition:attachment 标头。请参阅此处的specification,19.5.1部分。
答案 1 :(得分:2)
您可以使用分块传输编码。基本上,您发送一个“Transfer-encoding:chunked”标头,然后数据以分块模式发送,这意味着您发送一个块的长度,然后是块。你不断重复这个直到数据结束,此时你发送一个零长度的块。
详细信息位于RFC 2616。
答案 2 :(得分:1)
您可能正在使用等待生成所有内容的gzip。检查.htaccess是否有关于此的指示。
答案 3 :(得分:0)
您无需设置Content-Length
标头字段。此标头字段只是告诉客户端它预期的数据量。实际上,“错误”值可能导致客户端丢弃某些数据。
答案 4 :(得分:0)
如果您使用FireFox中的LiveHTTPHeaders插件,您可以看到phpMyAdmin发送的标头与您的应用程序发送的标头之间的区别。我不知道你错过了什么,但这应该给你一个提示。我看到运行快速测试的一个标题是“Transfer-Encoding:chunked”,我也看到他们没有发送内容长度。这是FireFox插件的链接,如果你还没有它: LiveHTTPHeaders
答案 5 :(得分:0)
http内容长度是一个SHOULD字段,所以你可以删除它... 但是你必须设置传输编码 看看Why "Content-Length: 0" in POST requests?