nginx 通过PHP从Azure存储帐户下载大型文件

lf5gs5x2  于 2023-04-29  发布在  Nginx
关注(0)|答案(1)|浏览(174)

我正在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在提供下载之前将文件完全读入内存(因为这将需要大量内存并且花费太长时间)。谁能帮我下载文件没有错误?

9wbgstp7

9wbgstp71#

通过使用fpassthru函数使用文件句柄而不是文件名修复:

$FileHandle=fopen($FileName,"rb");
fpassthru($FileHandle);

相关问题