2012-12-05 59 views
1

你好夥計stakoverflowers,PHP下載大文件返回0 Kb文件

我有一個PHP/Apache的問題。我有一個允許管理員上傳100Mb文件的應用程序。上傳效果很好,但我在下載時遇到問題。

它適用於較小的文件(使用50Mb文件進行測試),但出於某種原因,我無法獲得100 MB的文件。

這裏是我的PHP代碼

$extension = 'zip'; //for testing 

switch ($extension) { 
    case "dwg": $contentType="image/vnd.dwg"; break; 
    case "dxf": $contentType="image/vnd.dxf"; break; 
    case "pdf": $contentType="application/pdf"; break; 
    case "zip": $contentType="application/zip"; break; 
    case "png": $contentType="image/png"; break; 
    case "jpeg": $contentType="image/jpeg"; break; 
    case "jpg": $contentType="image/jpg"; break; 
    case "gif": $contentType="image/gif"; break; 
    default: 
    $contentType = ''; 
} 

@header("Content-type: " . $contentType); 
@header("Content-Disposition: attachment; filename=$filename"); 
@header("Cache-Control: no-cache, must-revalidate"); 
@header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // passed date 

echo file_get_contents($url); 

我也嘗試過其他解決方案,我發現SO。

header('Content-Description: File Transfer'); 
header('Content-Transfer-Encoding: binary'); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-type: " . $contentType); 
header("Content-Disposition: attachment; filename=\"".$filename."\""); 
header("Content-Length: ".filesize($url)); 

echo self::url_get_contents(URL_PUBLIC . $url); 

... 

private function url_get_contents ($url) { 
    if (!function_exists('curl_init')){ 
     die('CURL is not installed!'); 
    } 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     $output = curl_exec($ch); 
    curl_close($ch); 
     echo $output; 
    return $output; 
} 

或者

$file_contents = fopen($url, "r"); 
echo $file_contents; 
fclose($file_contents); 

所有的解決方案返回同樣的事情。文件大小爲0 Kb。 就像我所說的,尺寸較小的文件可以工作。

此外,當我在本地測試時,100 Mb大小的文件正確下載,所以我的猜測是問題來自服務器。我改變了php.ini如下

register_globals = Off 
magic_quotes_gpc = Off 
post_max_size = 128M 
memory_limit = 256M 
upload_max_filesize = 128M 
max_execution_time = 120 
expose_php = off 
session.save_path = /tmp 
mysqli.default_socket = /tmp/mysql5.sock 
mysql.default_socket = /tmp/mysql5.sock 

這可能是一個內存限制的問題,但不確定。

+0

第一個例子中的$ url變量是一個URL,前面是http://或者像/ home/yoursite這樣的路徑嗎? – drew010

+1

你有共享主機嗎?他們難道不能限制它嗎? (因爲它在本地工作?) – Trufa

+1

我敢打賭,這是由於託管的限制。時間限制將以PHP錯誤結束,甚至不會下載0字節的文件... – shadyyx

回答

1

我以前有類似的問題。我的問題竟然是主機提供商。一旦腳本執行時間過長,託管提供商通常會關閉它。嘗試通過phpMyAdmin上傳大型SQL腳本時遇到了相同的問題。

+0

我已經有了完全相同的問題,並改變託管服務提供商治癒它。 – Adam

+0

對於任何感興趣的人,內存限制設置爲195M,然後他們將其增加到295M。儘管我已經更改了php.ini,但我的價值並未考慮在內。 –

+0

@ vyx.ca如果您仍然遇到同樣的問題,我的託管服務提供商告訴我要創建一個'PHP.ini'文件並將其放在我的'cgi-bin'文件夾中。從那裏,我可以覆蓋任何默認設置。你可能有一個'max_execution_time'問題,就像我做的那樣。 –