2011-05-24 13 views
8

मैं php: // इनपुट का उपयोग कर php से कच्ची इनपुट स्ट्रीम पढ़ने की कोशिश कर रहा हूं। यह ज्यादातर फ़ाइलों के लिए काम करता है, हालांकि, अपलोड में 4 एमबी से अधिक फ़ाइलों को अनदेखा किया जा रहा है। मैंने post_max_size और upload_max_size को 20M पर सेट किया है, यह सोचकर कि यह मेरी समस्या का समाधान करेगा, लेकिन ऐसा नहीं हुआ। क्या कोई और php.ini सेटिंग है जिसे कॉन्फ़िगर करने की आवश्यकता है या क्या मुझे किसी प्रकार का खंडन करने की आवश्यकता है? यदि हां, तो मैं ऐसा करने के बारे में कैसे जाऊं?PHP इनपुट स्ट्रीम आकार सीमाएं

$fileName = $_SERVER['HTTP_X_FILE_NAME']; 
$contentLength = $_SERVER['CONTENT_LENGTH']; 

file_put_contents('uploads/' . $fileName, file_get_contents("php://input")); 
+0

FYI ... मैं xmlhttprequest के माध्यम से फ़ाइल भेज रहा हूं, प्रेषण विधि के माध्यम से फ़ाइल ऑब्जेक्ट पास कर रहा हूं। – srowley

+0

मैंने इसे समझ लिया। पूरी फ़ाइल को बफर में रखने के लिए PHP को स्मृति से बाहर चला रहा था, इसलिए मैंने स्मृति सीमा को php.ini memory_limit चर के साथ बढ़ाया। यह काम करता है, लेकिन यह सबसे अच्छा समाधान की तरह प्रतीत नहीं होता है। यदि किसी को फ़ाइल में php: // इनपुट स्ट्रीम को टुकड़ों में पढ़ने का तरीका पता है तो यह स्मृति सीमा को समाप्त नहीं करता है, कृपया मुझे बताएं! धन्यवाद – srowley

उत्तर

10

यह सब स्मृति में पहली कॉपी किए बिना प्रयास करें stream_copy_to_stream, जो सीधे फाइल में इनपुट की सामग्री पंप:: यहाँ upload.php कोड है

$input = fopen('php://input', 'rb'); 
$file = fopen($filename, 'wb'); 
stream_copy_to_stream($input, $file); 
fclose($input); 
fclose($file); 

वैकल्पिक:

$input = fopen('php://input', 'rb'); 
$file = fopen($filename, 'wb'); 
while (!feof($input)) { 
    fwrite($file, fread($input, 102400)); 
} 
fclose($input); 
fclose($file); 
+0

क्षमा करें, यह काम नहीं करता है, पहले जैसा ही परिणाम है। फिलहाल बड़ी फ़ाइलों को अपलोड करने का एकमात्र तरीका है php.ini फ़ाइल में memory_limit को बड़े आकार में सेट करना। किसी कारण से मैं इसे ini_set ("memory_limit", "64M") के साथ भी संशोधित नहीं कर सकता; – srowley

+0

@srowley यह अजीब है। मैंने '/ dev/random' से सैकड़ों एमबी स्ट्रीम करने के साथ परीक्षण किया और स्मृति उपयोग 7 एमबी से ऊपर कभी नहीं चला। मैन्युअल पृष्ठ पर एक टिप्पणी के मुताबिक, 'stream_copy_to_stream' कभी-कभी गलत व्यवहार करता प्रतीत होता है। "मैनुअल" विकल्प पोस्ट किया गया। अगर इससे कोई मदद नहीं मिलती है, तो आपकी समस्या कहीं और है। – deceze

+0

मैं वास्तव में अब उलझन में हूं .. आपकी पहली विधि वास्तव में 672 एम फ़ाइल के साथ काम करती है, लेकिन 5 एम फ़ाइल नहीं। मुझे नहीं पता क्यों। – srowley