2012-12-11 49 views
1

我想让用户下载大型视频文件。由于安全原因,这些文件位于公用文件夹之外。IIS 7.5上的PHP - 大文件下载块连接,直到下载完成

我正在使用fopen(),feof()和fread()的组合来下载chunck中的文件。

下载工作正常。该视频已下载,并且工作得很好。问题在于下载过程中。任何正在下载文件的用户都无法继续浏览该网站,直到该文件被下载。浏览器尝试建立连接,但在文件下载时挂起。下载完成后,立即建立连接。其他用户在下载过程中可以很好地浏览网站,所以它不像整个服务器挂起或者其他任何东西。

我正在使用安装在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(); 
    } 
} 
+0

您是否在下载中使用会话? –

+0

你的代码出现错误,添加一个“after filename.mp4” – Geert

+0

引用错误只在这个例子中,在实际的代码中它是正确的,我现在已经修复它在代码片段中了 – Botch

回答

3

我终于解决了这个问题。如上所述,这个问题确实与会议有关。即使session.auto_start关闭,CakePHP本身也在处理会话。所以,通过在while循环之前插入session_write_close(),问题就解决了。