-1

我想在某人的网站上添加一个下载链接到大型视频文件(大约300MB),但不幸的是他们在共享主机上(我告诉他们,他们必须升级,如果他们让很多人下载它)。我不希望人们有“目标另存为”和我通常使用这个代码强制下载:在共享服务器上强制下载大文件

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // some day in the past 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename={$file}"); 
header("Content-Transfer-Encoding: binary"); 
readfile($file); 

这正常工作与较小的文件,但不与较大的,甚至转向错误在我拿到后没有错误,也没有错误日志。我确定这是与共享内存限制(或者可能是超时)有关,但是有谁知道我如何去强制下载共享服务器上的大文件,理想情况下没有JavaScript,因为我确信我无法使用将内存限制设置得足够高?

非常感谢,

戴夫

+0

无关:删除“内容传输 - 编码”。它不存在于HTTP中。 –

回答

0

通常的解决办法是自己做的文件输出,让Web服务器的自己的缓冲处理事情:

$fh = fopen($file, 'rb') or die("Unable to open $file"); 
while($data = fread($fh, 10240)) { // 10kbyte chunks. 
    echo $data; 
} 
fclose($fh); 
+0

感谢您的回复,这对小文件也可以正常工作,但与大文件也有相同的问题。它似乎加载不超过约3秒,然后只显示一个空的页面?另外,我认为这样做效率低得多,因为它意味着它必须首先将它全部读入内存,或者对于我正在使用的方法来说,这也是真的吗?非常感谢 – deshg

+0

你只能在PHP的内存空间中一次读取10k。它后面的地方取决于你正在运行的网络服务器。如果这不起作用,那么检查您的服务器的错误日志,找出脚本无法正常工作的原因。 –

+0

当然,对不起,这是我疯了:)奇怪的是,当我检查错误日志没有提及它,就好像它运行良好,并且下载页面也在预期的访问日志中列出,只是当你访问它时没有任何反应。我无法弄清楚为什么它没有错误。 – deshg