PHPヘッダーとreadfile関数を使用してダウンロードを強制しようとしています。これが私のコードです:
if(file_exists($file_url)){header('Content-Type: '.$ftype);
header('Content-Transfer-Encoding: binary');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header("Content-Length: " . filesize($dir.$fname));
header("Content-disposition: attachment; filename=\"".$fname."\"");
ob_clean();
flush();
readfile($dir.$fname);
exit;}
問題は、37 MB を超えるファイルが 0 バイトでダウンロードされることです。私はphp構成を確認し、memory_limit
200MBに設定されています。これでチャンクでダウンロードしようとしました:
$filename = $dir.$fname;
$filesize = filesize($filename);
$chunksize = 4096;
if($filesize > $chunksize)
{
$srcStream = fopen($filename, 'rb');
$dstStream = fopen('php://output', 'wb');
$offset = 0;
while(!feof($srcStream)) {
$offset += stream_copy_to_stream($srcStream, $dstStream, $chunksize, $offset);
}
fclose($dstStream);
fclose($srcStream);
}
else
{
// stream_copy_to_stream behaves() strange when filesize > chunksize.
// Seems to never hit the EOF.
// On the other handside file_get_contents() is not scalable.
// Therefore we only use file_get_contents() on small files.
echo file_get_contents($filename);
}
ただし、ダウンロードを強制する代わりに、ファイルが表示されます。何か案は?