你好夥計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
這可能是一個內存限制的問題,但不確定。
第一個例子中的$ url變量是一個URL,前面是http://或者像/ home/yoursite這樣的路徑嗎? – drew010
你有共享主機嗎?他們難道不能限制它嗎? (因爲它在本地工作?) – Trufa
我敢打賭,這是由於託管的限制。時間限制將以PHP錯誤結束,甚至不會下載0字節的文件... – shadyyx