【发布时间】:2009-11-25 08:07:26
【问题描述】:
我有一个网页,我用它来让经过身份验证的用户访问下载文件。这些文件位于根文件夹中(通常不能通过 HTTP 访问),我使用 PHP 脚本和 fopen 函数来生成开始下载文件的网页。它适用于其中三个文件(所有文件均小于 200KB),但第四个文件(即 40MB)保存为空文件。
如果我将 40MB 文件移动到 HTTP 可访问的文件夹中,文件的链接可以正常工作,但它显然不能提供我想要的受限访问。
我已在脚本中确认该文件正在被 PHP 找到,但由于某种原因,当发送标头时,40MB 文件立即完成下载,为 0KB。
有趣的是,这段代码在我的本地开发服务器上运行良好,但在生产服务器上却不行。两者都运行相同版本的 PHP (5.2.10),并且具有相同的内存和执行时间设置(32M 和 30 秒)。我尝试提高生产 memory_limit 和 max_execution_time 值(到 64M 和 60secs),但没有效果。
有什么想法吗?这是我的 PHP 脚本(更改文件名以保护无知):
<?php
// Download filename given in the $_GET['filename'] variable
$filepath = $_SERVER['DOCUMENT_ROOT'] . '/../';
if (isset($_REQUEST['type'])) {
switch (strtoupper($_REQUEST['type'])) {
case 'EVAL':
$filename = "littlefile1.zip";
break;
case 'EXE':
$filename = "bigfile.zip";
break;
case 'RPT':
$filename = "littlefile2.zip";
break;
case 'UPD':
$filename = "littlefile3.zip";
break;
default:
die();
}
header("Content-Disposition: attachment; filename=" . $filename);
header("Content-Length: " . filesize($filepath . $filename));
header("Content-Type: application/octet-stream");
$fp=fopen($filepath . $filename, 'rb');
fpassthru($fp);
ob_flush();
fclose($fp);
}
?>
提前致谢!
响应 Greg 的评论,我得到的标题错误如下所示:
Date: Sun, 29 Nov 2009 19:58:16 GMT
Server: Apache/2.2.3 (Red Hat)
X-Powered-By: PHP/5.2.10
Content-Disposition: attachment; filename=bigfile.zip
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 44964864
Connection: close
Content-Type: application/octet-stream
500 Internal Server Error
【问题讨论】:
-
你得到什么标题?
-
您可以直接调用
readfile(),而不是fopen(), fpassthru(), fclose()。这将为您节省 2 个函数调用。 nl3.php.net/manual/en/function.readfile.php