【问题标题】:PHP download page: file_exists() returns true, but browser returns 'page not found'PHP 下载页面:file_exists() 返回 true,但浏览器返回 'page not found'
【发布时间】:2012-11-11 01:11:03
【问题描述】:

我正在使用 PHP 作为文件下载页面。这是问题代码的sn-p:

if (file_exists($attachment_location)) {
    header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
    header("Cache-Control: public"); // needed for i.e.
    header("Content-Type: application/zip");
    header("Content-Transfer-Encoding: Binary");
    header("Content-Length:".filesize($attachment_location));
    header("Content-Disposition: attachment; filename=file.zip");
    readfile($attachment_location);  
    die("Hooray");   
}
else {
    die("Error: File not found.");
}

此代码在本地测试时运行良好,但在部署到实时服务器后,浏览器返回“找不到页面”错误。我认为这可能是一个 .htaccess 问题,但实时服务器上的所有 .htaccess 文件都与它们的本地对应文件相同。我的下一个猜测是实时服务器的 PHP 配置,但我不知道什么 PHP 设置可能会导致这种行为。

file_exists() 函数总是返回 true - 我已经在实时服务器上检查了这一点,它总是正确地获取文件、文件的大小等,所以它确实有文件的句柄。它只是不会执行下载!

主站点是 Wordpress 站点,但此代码不是 Wordpress 页面的一部分 - 它位于站点根目录中的独立目录中。

更新:is_file() 和 is_readable() 都为文件返回 true,所以这不是问题。导致问题的具体行是:

readfile($attachment_location)

在那之前的一切都非常快乐。

【问题讨论】:

  • 尝试回显文件路径,看看是否有什么可疑之处
  • 也许在您的 Live Server 中您已经配置了您的 apache 站点可用配置,拒绝用户访问。 PHP 可能能看到文件,但不能看到用户。
  • 如果 file_exists() 始终返回 true,则“else”代码路径无法执行。
  • 文件路径看起来不错。我将查看 apache 中可用的站点配置。并且 file_exists 总是返回 true 不是问题 - 我不希望'else'代码路径无论如何执行!我只是想指出问题似乎不在于文件被拾取。
  • 我猜额外的下划线只是一个错字?

标签: php wordpress .htaccess download


【解决方案1】:

仅仅因为一个文件存在并不意味着你可以提供它。它可能具有错误的权限,或者在其他内容写入时被锁定,它甚至可能根本不是文件。 file_exists 函数为目录、符号链接等返回 true。

你可能想看看使用 is_file 代替。此外,您可能还想查看 is_readable 以进行文件权限检查。

【讨论】:

  • 谢谢 - 我会尝试 is_file 和 is_readable 并报告。文件权限设置为 644 - 我认为这已经足够了,但会尝试 777 以确保 100% 确定
  • 好的 - is_file 和 is_readable 都返回 true。我还将权限设置为 777,但仍然没有运气!不过感谢您的帮助
【解决方案2】:

原来是文件大小问题。有问题的文件非常大(超过 300MB) - 我尝试用较小的文件(~1MB)替换它,一切都按预期工作。下一个障碍是尝试让服务器处理大文件!感谢大家的帮助。

编辑:在readfile function page at php.net 上有很多关于 readfile 函数的限制以及如何规避它们的讨论

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2014-09-16
    相关资源
    最近更新 更多