2010-02-23 32 views
5

Cố gắng ép tải về tập tin với PHP sử dụng thông thường:Có giới hạn nào về kích thước tệp khi tải xuống bằng PHP không?

header("Content-type: $type"); 
header("Content-Disposition: attachment; filename=$name"); 
header('Content-Length: ' . filesize($path)); 

Và nó thành công cho các tập tin ở đâu đó dưới 32 mb. Đối với những cái lớn hơn nó chỉ trả về tập tin zeroed.

Rõ ràng là có một số loại giới hạn, nhưng điều gì đặt ra? Sử dụng Apache 2.2.11 và PHP 5.3.0.

+0

PHP không có giới hạn như vậy. Điều này sẽ được yêu cầu trên serverfault vì nó liên quan đến cấu hình Apache của bạn. – hobodave

Trả lời

0

Bên trong php.ini, bạn sẽ thấy cài đặt.

Tôi không thể nhớ tên tùy chọn trên đầu của tôi, nhưng tôi sẽ xem bên trong php.ini của tôi ngay bây giờ và thử tìm nó.

Chỉ cần xóa nó và nó sẽ hoạt động.

Added

Được rồi, ai đó hãy sửa lại cho tôi nếu tôi sai, nhưng là nó

memory_limit

+0

Cái gì? PHP không có cài đặt "tải xuống tối đa" của bất kỳ loại nào. Hãy dành thời gian để ít nhất nghiên cứu câu trả lời của bạn để bạn có thể thực sự _provide one_. – hobodave

+0

Tôi nghĩ rằng vấn đề là bởi vì anh ta đang tạo ra các tập tin mình, do đó memory_limit ở trên. Hãy sửa tôi nếu tôi sai vì tôi cũng muốn biết điều này. – Layke

+1

Không có đủ thông tin để xác định điều đó. memory_limit phải làm gì với bao nhiêu bộ nhớ mà tập lệnh có thể sử dụng. Điều này sẽ chỉ đi vào chơi nếu bạn đã cố gắng để đọc toàn bộ tập tin vào bộ nhớ, hoặc đủ của nó để vượt quá memory_limit. Gửi tiêu đề không làm điều này. – hobodave

3

Nó có vẻ như bạn đang tải toàn bộ file vào RAM trước khi gửi nó xuống cho người nhận. Bạn sẽ muốn xem xét các luồng PHP để có thể gửi nội dung tệp đầy đủ mà không phải đọc tất cả nội dung đó vào RAM trước: http://php.net/streams

+0

Tôi đang sử dụng chức năng fopen, fread ($ fh, $ chunksize), fclose. Họ có an toàn cho những trường hợp như vậy không? – jayarjo

+0

Dạng đơn giản nhất là sử dụng 'readfile' http://php.net/manual/en/function.readfile.php – deceze

+0

Đó là một điểm tốt để lừa dối; Tôi quen với việc truyền dữ liệu từ cơ sở dữ liệu hoặc nguồn khác, vì vậy tôi quay trở lại luồng khi có giải pháp đơn giản hơn. – MightyE

8

Tôi cuối cùng tình cờ gặp bài đăng này: http://w-shadow.com/blog/2007/08/12/how-to-force-file-download-with-php/.

function output_file($file, $name, $mime_type='') 
{ 
/* 
This function takes a path to a file to output ($file), 
the filename that the browser will see ($name) and 
the MIME type of the file ($mime_type, optional). 

If you want to do something on download abort/finish, 
register_shutdown_function('function_name'); 
*/ 
if(!is_readable($file)) die('File not found or inaccessible!'); 

$size = filesize($file); 
$name = rawurldecode($name); 

/* Figure out the MIME type (if not specified) */ 
$known_mime_types=array(
    "pdf" => "application/pdf", 
    "txt" => "text/plain", 
    "html" => "text/html", 
    "htm" => "text/html", 
    "exe" => "application/octet-stream", 
    "zip" => "application/zip", 
    "doc" => "application/msword", 
    "xls" => "application/vnd.ms-excel", 
    "ppt" => "application/vnd.ms-powerpoint", 
    "gif" => "image/gif", 
    "png" => "image/png", 
    "jpeg"=> "image/jpg", 
    "jpg" => "image/jpg", 
    "php" => "text/plain" 
); 

if($mime_type==''){ 
    $file_extension = strtolower(substr(strrchr($file,"."),1)); 
    if(array_key_exists($file_extension, $known_mime_types)){ 
     $mime_type=$known_mime_types[$file_extension]; 
    } else { 
     $mime_type="application/force-download"; 
    }; 
}; 

ob_end_clean(); //turn off output buffering to decrease cpu usage 

// required for IE, otherwise Content-Disposition may be ignored 
if(ini_get('zlib.output_compression')) 
    ini_set('zlib.output_compression', 'Off'); 

header('Content-Type: ' . $mime_type); 
header('Content-Disposition: attachment; filename="'.$name.'"'); 
header("Content-Transfer-Encoding: binary"); 
header('Accept-Ranges: bytes'); 

/* The three lines below basically make the 
    download non-cacheable */ 
header("Cache-control: private"); 
header('Pragma: private'); 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

// multipart-download and download resuming support 
if(isset($_SERVER['HTTP_RANGE'])) 
{ 
    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); 
    list($range) = explode(",",$range,2); 
    list($range, $range_end) = explode("-", $range); 
    $range=intval($range); 
    if(!$range_end) { 
     $range_end=$size-1; 
    } else { 
     $range_end=intval($range_end); 
    } 

    $new_length = $range_end-$range+1; 
    header("HTTP/1.1 206 Partial Content"); 
    header("Content-Length: $new_length"); 
    header("Content-Range: bytes $range-$range_end/$size"); 
} else { 
    $new_length=$size; 
    header("Content-Length: ".$size); 
} 

/* output the file itself */ 
$chunksize = 1*(1024*1024); //you may want to change this 
$bytes_send = 0; 
if ($file = fopen($file, 'r')) 
{ 
    if(isset($_SERVER['HTTP_RANGE'])) 
    fseek($file, $range); 

    while(!feof($file) && 
     (!connection_aborted()) && 
     ($bytes_send<$new_length) 
     ) 
    { 
     $buffer = fread($file, $chunksize); 
     print($buffer); //echo($buffer); // is also possible 
     flush(); 
     $bytes_send += strlen($buffer); 
    } 
fclose($file); 
} else die('Error - can not open file.'); 

die(); 
} 

/********************************************* 
      Example of use 
**********************************************/ 

/* 
Make sure script execution doesn't time out. 
Set maximum execution time in seconds (0 means no limit). 
*/ 
set_time_limit(0); 
$file_path='that_one_file.txt'; 
output_file($file_path, 'some file.txt', 'text/plain'); 

Thêm tất cả các tiêu đề đề nghị đó và cũng sử dụng:

ob_end_clean(); //turn off output buffering to decrease cpu usage 

trước khi bất kỳ đầu ra - đã giúp. Không còn giới hạn nào nữa. Các tệp tải xuống hoàn toàn thậm chí những tệp lớn.

+0

Sử dụng '@' lỗi đàn áp là không thể chấp nhận vì nó là chậm và có thể dẫn đến những cơn ác mộng gỡ lỗi. –

+0

Đã xóa nó, cảm ơn bạn đã chỉ ra điều này :) – jayarjo

+2

#giveThisMan_a_bells! Cảm ơn @Jayarjo, điều này đã giải quyết nó cho tôi! –

0

cũng có thể cần phải set_time_limit(0);

0

Có 1 GB giới hạn xây dựng trong Apache, ngay cả khi u'll cố gắng để tải về một tập tin từ ông thư mục gốc, tránh hoàn toàn php.

Các vấn đề liên quan