4

我知道这是可能的,但我似乎无法弄清楚。

我有一个有几十万个结果的 mySQL 查询。我希望能够发送结果,但似乎响应需要内容长度标头才能开始下载。

在phpMyAdmin中,如果你去导出一个数据库,它会立即开始下载,FF只是说未知文件大小,但它可以工作。我查看了该代码,但无法弄清楚。

帮助?

谢谢。

4

6 回答 6

10

该文档在第 14.14 节中指出,在 HTTP 中,只要可以在传输之前确定消息的长度,就应该发送它,除非第 4.4 节中的规则禁止这样做。这意味着如果您不能说出它的大小,则不必发送它。

只是不要发送它。

如果您想在所有数据可用之前将部分数据发送到浏览器,是否刷新输出缓冲区?也许这就是问题所在,而不是缺少标题?

你使用flush的方式是这样的:

  • 生成一些输出,应该将其添加到缓冲区
  • flush()它,它应该将当前缓冲区发送到客户端
  • 转到 1

因此,如果您的查询返回大量结果,您可以只生成 100 或 1000 个结果的输出,然后刷新,依此类推。

此外,要告诉客户端浏览器尝试保存文件而不是在窗口中显示它,您也可以尝试使用Content-disposition: 附件标头。请参阅此处的规范,第 19.5.1 节。

于 2009-03-16T12:16:46.183 回答
2

您可以使用分块传输编码。基本上,您发送一个“Transfer-encoding: chunked”标头,然后以分块模式发送数据,这意味着您发送一个块的长度,然后是该块。你一直重复这个直到数据结束,此时你发送一个零长度的块。

详细信息在RFC 2616中。

于 2009-03-16T13:18:48.797 回答
1

您可能正在使用等待所有内容生成的 gzip。检查您的 .htaccess 以获取有关此的指令。

于 2009-03-16T12:29:48.757 回答
0

您不需要设置Content-Length标题字段。此标头字段只是告诉客户端它必须预期的数据量。事实上,一个“错误”的值会导致客户端丢弃一些数据。

于 2009-03-16T12:15:23.067 回答
0

如果您在 FireFox 中使用 LiveHTTPHeaders 插件,您可以看到 phpMyAdmin 发送的标头与您的应用程序发送的标头之间的差异。我不知道你具体错过了什么,但这应该给你一个提示。我看到运行快速测试的一个标头是“Transfer-Encoding: chunked”,我还看到它们没有发送内容长度。如果您还没有 FireFox 插件,这里有一个链接: LiveHTTPHeaders

于 2009-03-16T12:18:28.817 回答
0

http 内容长度是一个 SHOULD 字段,所以你可以删除它......但你必须设置传输编码然后看看Why "Content-Length: 0" in POST requests?

于 2009-03-16T12:20:03.163 回答