【问题标题】:Cannot download using fpassthru无法使用 fpassthru 下载
【发布时间】: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 到响应(即使我没有打印任何东西?),并且该响应的大小似乎与文件,但文件没有下载。

标签: php azure download


【解决方案1】:

我能够通过将使用 Azure API 获得的流直接传递给 fpassthru 来下载文件,而无需创建文件。不幸的是,我无法显示代码,因为它属于我已经完成的项目,并且代码不再可供我使用。

【讨论】:

  • 很高兴看到您已解决此问题。在不知道您的详细代码的情况下,我想您的解决方案与我在第 3 条中所说的差不多。
  • 类似,但不涉及浏览器重定向
【解决方案2】:

我尝试了您的代码(没有 blob 部分),它运行良好。我可以下载一个二进制文件。根据我的经验,这里有一些需要检查的地方:

【讨论】:

    猜你喜欢
    • 2014-02-12
    • 2019-09-10
    • 1970-01-01
    • 2020-01-24
    • 2017-09-21
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多