ユーザーが大きなビデオファイルをダウンロードできるようにしたい。これらのファイルは、セキュリティ上の理由からパブリックフォルダの外にあります。
fopen()、feof()、およびfread()の組み合わせを使用して、ファイルをチャンクにダウンロードしています。
ダウンロードは正常に機能します。ビデオがダウンロードされ、問題なく動作します。問題はダウンロード中です。ファイルをダウンロードしているユーザーは、ファイルがダウンロードされるまでサイトを閲覧し続けることはできません。ブラウザは接続を確立しようとしていますが、ファイルのダウンロード中にハングします。ダウンロードが完了すると、接続はすぐに確立されます。他のユーザーはダウンロード中にサイトをうまく閲覧できるので、サーバー全体がハングするようなことはありません。
IISサーバーにインストールされているPHP(CakePHP)を使用しています。
コードのスニペット:
$name = "filename.mp4";
$folder = "private/folder/";
$handle = fopen($folder.$name, "rb");
if(!$handle)
{
echo "File not found";
}
else
{
header("Content-length:".filesize($folder.$name));
header("Content-Type: video/mp4");
header("Content-Disposition: attachment; filename='filename.mp4'");
header("Content-Transfer-Encoding: binary");
session_write_close(); // this is the solution
while(!feof($handle))
{
$buffer = fread($handle, 1*(1024*1024));
echo $buffer;
ob_flush();
flush();
}
}