我正在使用PHP进行文件下载页面。以下是问题代码的片段:
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页面的一部分 - 它位于站点根目录中的独立目录中。
UPDATE:is_file()和is_readable()都为文件返回true,所以这不是问题。导致问题的具体行是:
readfile($attachment_location)
直到那时为止,一切都非常高兴。
答案 0 :(得分:4)
仅仅因为文件存在并不意味着你可以提供它。它可能具有错误的权限,或者在其他内容写入时被锁定,甚至可能根本不是文件。 file_exists函数对目录,符号链接等返回true。
您可能希望查看使用is_file。您还可以查看is_readable以进行文件权限检查。
答案 1 :(得分:2)
原来是文件大小的问题。有问题的文件非常庞大(超过300MB) - 我尝试用较小的文件(~1MB)替换它,一切都按预期工作。下一个障碍是尝试让服务器处理大文件!谢谢大家的帮助。
编辑:关于readfile函数的限制以及如何在readfile function page at php.net
上规避它们的讨论很多