2010-02-23 15 views
5

सामान्य का उपयोग कर PHP के साथ फाइल डाउनलोड के लिए मजबूर करने की कोशिश कर रहा:PHP के साथ डाउनलोड करते समय फ़ाइल के आकार पर कुछ सीमा है?

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

और यह कहीं न कहीं 32 एमबी से नीचे फ़ाइलों के लिए सफलतापूर्वक करता है। बड़े लोगों के लिए यह सिर्फ शून्य फ़ाइल लौटाता है।

स्पष्ट रूप से कुछ प्रकार की सीमा है, लेकिन यह क्या सेट करता है? अपाचे 2.2.11 और PHP 5.3.0 का उपयोग करना।

+0

PHP की ऐसी कोई सीमा नहीं है। सर्वरफॉल्ट पर यह पूछा जाना चाहिए क्योंकि यह आपके अपाचे कॉन्फ़िगरेशन से संबंधित है। – hobodave

उत्तर

0

php.ini के अंदर आप सेटिंग देखेंगे।

मुझे अपने सिर के ऊपर से विकल्प का नाम याद नहीं है, लेकिन अब मैं अपने php.ini के अंदर देखूंगा और कोशिश करूँगा।

बस इसे हटा दें और यह काम करेगा।

जोड़ा गया

ठीक है, कोई मुझे सही करें अगर मैं गलत हूँ, लेकिन यह है

memory_limit

+0

क्या? PHP में किसी भी प्रकार की "अधिकतम डाउनलोड" सेटिंग नहीं है। कृपया कम से कम अपने उत्तर का शोध करने के लिए समय लें ताकि आप वास्तव में __ को बढ़ावा दे सकें। – hobodave

+0

मुझे लगता है कि समस्या यह है क्योंकि वह स्वयं फ़ाइल को उत्पन्न कर रहा है, इसलिए ऊपर स्मृति_limit। अगर मैं गलत हूं तो कृपया मुझे सही करें क्योंकि मैं यह भी जानना चाहता हूं। – Layke

+1

यह निर्धारित करने के लिए पर्याप्त जानकारी मौजूद नहीं है। memory_limit को यह करना है कि स्क्रिप्ट कितनी मेमोरी का उपयोग कर सकती है। यह केवल तभी खेला जाएगा जब आपने पूरी फ़ाइल को स्मृति में पढ़ने की कोशिश की हो या स्मृति_limit से अधिक होने के लिए पर्याप्त हो। हेडर भेजना ऐसा नहीं करता है। – hobodave

3

ऐसा लगता है तुम राम में पूरी फ़ाइल लोड कर रहे हैं की तरह भेजने से पहले यह प्राप्तकर्ता को नीचे। आप पूरी तरह से रैम में इसे पढ़ने के बिना पूर्ण फ़ाइल सामग्री भेजने में सक्षम होने के लिए PHP स्ट्रीम में देखना चाहते हैं: http://php.net/streams

+0

मैं fopen, fread ($ fh, $ chunksize), fclose कार्यों का उपयोग कर रहा हूँ। क्या वे ऐसे मामलों के लिए सुरक्षित नहीं हैं? – jayarjo

+0

सबसे आसान रूप 'readfile' का उपयोग करना है http://php.net/manual/en/function.readfile.php – deceze

+0

यह एक अच्छा बिंदु धोखा है; मैं किसी डेटाबेस या अन्य स्रोत से डेटा पिप करने के आदी हूं, इसलिए जब मैं एक सरल समाधान उपलब्ध होता हूं तो मैं स्ट्रीम पर वापस आ जाता हूं। – MightyE

8

अंत में मैंने इस पोस्ट पर ठोकर खाई: 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'); 

सभी हेडर वहाँ की सिफारिश जोड़ा जा रहा है और यह भी का उपयोग कर:

ob_end_clean(); //turn off output buffering to decrease cpu usage 
किसी भी उत्पादन से पहले

- मदद की है। कोई और सीमाएं देखने योग्य नहीं हैं। फ़ाइलें पूरी तरह से भी विशाल डाउनलोड करें।

+0

'@' त्रुटि दमन का उपयोग करना अनावश्यक है क्योंकि यह धीमा है और इससे दुःस्वप्न दुःस्वप्न हो सकता है। –

+0

इसे हटा दिया गया, इसे इंगित करने के लिए धन्यवाद :) – jayarjo

+2

#giveThisMan_a_bells! धन्यवाद @ जयार्जो, यह मेरे लिए हल हो गया! –

0

को वहाँ अपाचे में 1 जीबी की सीमा का निर्माण है आवश्यकता हो सकती है, भले ही u'll पूरी तरह से php परहेज रूट निर्देशिका वह से कोई फ़ाइल डाउनलोड करने का प्रयास करें।

संबंधित मुद्दे