部分文件下载,我需要整个文件

时间:2013-01-29 14:27:52

标签: php header http-headers

我正在尝试通过使用标头在我的服务器上下载一些文件。它找到了这个文件,但是当它们是2到3 MB时,它只能下载200到300 kbs的这些文件。我似乎无法将手指放在这一个上。

这是我的代码。

我在文件FYI的开头有一个ob_start方法。

$fileName = $row['fileURL'];
$fileURL = 'powerpoints/' . $fileName;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $fileName);
header("Content-Transfer-Encoding: binary");
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($fileURL);
exit();

编辑以下......修改后的代码

$fileName = $row['fileURL'];
$fileURL = 'powerpoints/' . $fileName;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $fileName);
header("Content-Transfer-Encoding: binary");
header('Cache-Control: must-revalidate');
header('Content-Length: ' . filesize($row['size']));

$fdl = fopen($fileURL, "r"); 

if ($fdl === false) {
    die("Issue opening $fileURL");
}

while (!feof($fdl))
{
    $buffer = fread($fdl, 4096); 
    print $buffer;
}  

fclose($fdl); 

1 个答案:

答案 0 :(得分:0)

Readfile将尝试立即将所有内容读入内存。另外,我没有看到在这里使用输出缓冲的意义,只要你只是以块的形式读取和输出文件就有更大的成功机会。

所以我会摆脱输出缓冲,尝试这样的东西而不是readfile:

sleep(1);
$fdl = fopen($fileURL, 'r');
if ($fdl === false) {
  die("Issue opening $fileURL");
}
while(!feof($fdl)) {
  $buffer = fread($fdl, 4096);
  print $buffer;
}
fclose($fdl);

另外请注意,为什么在缓存控制上必须重新验证时才有Pragma: public