我想允许用户下载大型视频文件。由于安全原因,这些文件位于公用文件夹之外。
我正在使用 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();
}
}