【发布时间】:2015-08-28 18:12:45
【问题描述】:
我正在尝试向用户提供文件以供下载,但我在使用 fpassthru 时遇到了问题。我用来下载文件的函数是:
http://pastebin.com/eXDpgUqq
请注意,该文件是从 blob 成功创建的,实际上是我希望用户下载的文件。脚本成功退出,没有报错,但是文件没有下载。我一辈子都想不出有什么问题。
编辑:我从 fopen() 中删除了错误抑制,但它仍然没有报告错误。不知何故,输出缓冲区中的数据永远不会被浏览器告知要下载。
【问题讨论】:
-
两件事:(1)在提供文件时不要输出任何东西,因为这会导致无效数据。并且 (2) 您是否检查过 FPASSTHROUGH 的结果 - 根据文档 (php.net/manual/en/function.fpassthru.php) 它应该返回 FALSE 或通过的数字字节。如果它返回 false,则将您的错误报告转为 E_ALL 并查看发生了什么。
-
这是进行建议修改后的新函数:pastebin.com/fT7DFdvS,仅输出:
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAXwAAA等如果有不同的方式查看 fpassthru 的返回值,这可能会有所帮助,但我每当包含 header()s 时,就会得到这个无意义的输出。此外,没有报告任何错误。 -
不 print_r fpassthrough!它会将 FALSE 或字节数发送到输出缓冲区。尝试将您对 fpassthrou 的调用更改为:ob_end_clean(); @fpassthru($file); ob_end_flush(); fclose($file);
-
这是我的修改:pastebin.com/RtCb3fuF 它仍然会打印相同的 gobbledygook 到响应(即使我没有打印任何东西?),并且该响应的大小似乎与文件,但文件没有下载。