2013-08-29 40 views
0

一直试图让这个工作一段时间,并且我已经阅读了一堆SO帖子。但我已经试过这一切,它不工作..PHP Force下载 - 给出190byte文件

这是我现在想要的代码:

header("Content-type: application/octet-stream"); 
header("Content-Length: " . filesize($_REQUEST['file'])); 
header("Content-Disposition: attachment; filename=".basename($_REQUEST['file'])); 

readfile($_REQUEST['file']); 

但它不工作。它适用于我所有的其他文件,但不适用于.FLV。 它显示的大小是190bytes,它只保存了一个190bytes的文件。它具有正确的网址,因为我可以在浏览器中输入网址并播放视频。

任何想法?

我已经尝试了很多头:

header('Pragma: public'); // required 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: attachment; filename=".basename($_REQUEST['file'])); 
    header("Content-Type: video/mpeg"); 
    header("Content-Transfer-Encoding: binary"); 

    header("Content-Length: " . filesize($_REQUEST['file'])); 


    header('Cache-Control: must-revalidate, post-check=0, pre-check=0', false); 
    header('Cache-Control: private', false); // required for certain browsers 

我要的是一个savefile.php文件,可以保存所有的不同的视频格式,同时还ZIP,RAR,EXE等文件。这将是巨大的,如果有会支持这一切某种方式的基础上,通过文件指定的文件扩展名...

编辑:


我甚至使用FOPEN试过,但没有作品。它显示190个字节,但我知道url是正确的。并且该文件的工作原理(现在在xampp上进行本地测试,所以我可以轻松访问我的文件)

回答

0

啊,找到了答案..没想过打开190字节的.flv文件并检查它里面的内容。有一条错误消息:

<br /> 
<b>Fatal error</b>: Allowed memory size of 134217728 bytes exhausted (tried to allocate 197980160 bytes) in <b>C:\xampp\htdocs\portfolio_003\savefile.php</b> on line <b>47</b><br /> 

所以,我不得不改变在php.ini

+0

你永远不应该读整个文件到内存! – Seti

1

值不应更改内存限制 - 32-64 MB是很不够的几乎一切。 将readfile($_REQUEST['file']);更改为: $handle=fopen($_REQUEST['file'], 'rb'); while (!feof($handle)) { echo fread($handle, 8192); flush(); } fclose($handle); 这将读取8kb的文件,然后将其推送到客户端,依此类推......它将消耗不多的内存(因为它不会一次读取整个文件)。

+0

真棒! 有了这个解决方案,我们不需要增加内存限制! – PJunior

+0

是的,你不应该提高它 - 在大多数你不能的共享服务器上 - 也会导致问题 - 如果用户请求500MB文件会怎么样?甚至更大。 同样考虑不要以这种方式发送这样的文件 - 因为在最大执行时间之后 - 传输将被切断。 – Seti

+0

是的,我知道! :)这个解决方案。 – PJunior