我的文件(126 MB大小,.exe)给了我一些问题.
我正在使用标准的laravel下载方法.
我尝试增加内存,但它仍然说我的内存不足,或者我下载了0 KB大小的文件.
我的代码是
ini_set("memory_limit","-1"); // Trying to see if this works return Response::download($full_path);
我做错了什么?
– 编辑 –
继续Phill Sparks的评论,这就是我所拥有的并且它有效.
它是Phill的组合加上来自PHP.net的一些.
不确定是否有遗失的东西?
public static function big_download($path,$name = null,array $headers = array()) { if (is_null($name)) $name = basename($path); // Prepare the headers $headers = array_merge(array( 'Content-Description' => 'File Transfer','Content-Type' => File::mime(File::extension($path)),'Content-Transfer-Encoding' => 'binary','Expires' => 0,'Cache-Control' => 'must-revalidate,post-check=0,pre-check=0','Pragma' => 'public','Content-Length' => File::size($path),),$headers); $response = new Response('',200,$headers); $response->header('Content-Disposition',$response->disposition($name)); // If there's a session we should save it now if (Config::get('session.driver') !== '') { Session::save(); } // Below is from http://uk1.PHP.net/manual/en/function.fpassthru.PHP comments session_write_close(); ob_end_clean(); $response->send_headers(); if ($file = fopen($path,'rb')) { while(!feof($file) and (connection_status()==0)) { print(fread($file,1024*8)); flush(); } fclose($file); } // Finish off,like Laravel would Event::fire('laravel.done',array($response)); $response->foundation->finish(); exit; }
发生这种情况是因为Response :: download()在将文件提供给用户之前将文件加载到内存中.不可否认,这是框架中的一个缺陷,但大多数人并不试图通过框架提供大型文件.
原文链接:https://www.f2er.com/laravel/135636.html解决方案1 – 将要下载的文件放在公共文件夹,静态域或cdn中 – 完全绕过Laravel.
可以理解的是,您可能试图通过登录来限制对下载的访问,在这种情况下,您需要制作自己的下载方法,这样的事情应该有效……
function sendFile($path,$response->disposition($name)); // If there's a session we should save it now if (Config::get('session.driver') !== '') { Session::save(); } // Send the headers and the file ob_end_clean(); $response->send_headers(); if ($fp = fread($path,'rb')) { while(!feof($fp) and (connection_status()==0)) { print(fread($fp,8192)); flush(); } } // Finish off,array($response)); $response->foundation->finish(); exit; }
这个功能是Response::download()和Laravel的shutdown process的组合.我没有机会亲自测试,我没有安装Laravel 3.如果能为您完成这项工作,请告诉我.
PS:这个脚本唯一不需要处理的是cookie.不幸的是Response::cookies()功能受到保护.如果这成为问题,您可以从函数中提取代码并将其放入sendFile方法中.
PPS:输出缓冲可能存在问题;如果这是一个问题,请查看readfile() examples的PHP手册,有一种方法可以在那里工作.
PPPS:由于您正在使用二进制文件,因此可能需要考虑使用fpassthru()替换readfile()
编辑:忽略PPS和PPPS,我更新了代码以使用fread打印,因为这似乎更稳定.