我正在Azure WebApp上构建一个网站以下载大文件(4GB及以上)。实际文件存储在Azure存储帐户的文件共享中。此文件共享被挂载到WebApp中,因此PHP可以访问这些文件。PHP可以读取文件夹和文件信息,但下载失败。我可以很好地下载文件,与Web服务器上的文件相比,它们的大小相同,但文件已损坏,因为它们充满了PHP错误:<b>Notice</b>: ob_flush(): Failed to flush buffer. No buffer to flush in <b>/home/site/wwwroot/SoftwareDownload/download.php</b> on line <b>37</b><br/>
这就是下载的内容。PHP看起来像:
<?PHP
set_time_limit (86400); //24 hours
IF (isset($_GET['FileName']))
{
$FileName=$_GET['FileName'];
header ("Content-Type: application/zip");
header("Content-type: application/octet-stream");
header ("Content-Length: " . filesize($FileName));
$DownloadFileName = basename($FileName);
header ("Content-Disposition: attachment; filename=\"$DownloadFileName\"");
readfile_chunked($FileName);
}
ELSE
{
echo "No File Specified!";
die();
}
// Read a file and display its content chunk by chunk
function readfile_chunked($filename, $retbytes = TRUE)
{
$ChunckSize=50*1024; // 50K buffer
$buffer = '';
$cnt =0;
$handle = fopen($filename, 'rb');
if ($handle === false)
{
return false;
}
$BytesProcessed=0;
while (!feof($handle))
{
$buffer = fread($handle, $ChunckSize);
echo $buffer;
ob_flush();
flush();
if ($retbytes)
{
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status)
{
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
?>
我试着用一个简单的
fpassthrough($FileName);
但下载根本就启动不了我尝试在readfile_chunked函数的开头使用不同的缓冲区大小,但这也无济于事。显然,我不希望PHP在提供下载之前将文件完全读入内存(因为这将需要大量内存并且花费太长时间)。谁能帮我下载文件没有错误?
1条答案
按热度按时间9wbgstp71#
通过使用fpassthru函数使用文件句柄而不是文件名修复: