2013-05-18 16 views
8

में फ़ाइल में इनपुट इसलिए मैं चाहता हूं कि उपयोगकर्ता पोस्ट अधिकतम आकार मानों के बारे में चिंता किए बिना बड़ी फ़ाइलों को अपलोड करने में सक्षम हों। विकल्प PUT का उपयोग कर रहा है और फ़ाइल को कच्चे डेटा के रूप में भेज रहा है। jQuery का उपयोग करते समय मैं यह कर सकता:फॉर्म सीमाएं और php: // इनपुट php

var data = new FormData(); 
    jQuery.each($('#file_upload')[0].files, function(i, file) { 
    data.append('file-'+i, file); 
}); 
$.ajax({ 
    url: 'upload.php?filename=test.pdf', 
    data: data, 
    cache: false, 
    contentType: false, 
    processData: false, 
    type: 'PUT', 
}); 

PHP में मैं यह कर सकता:

$f = fopen($_GET['filename'], "w"); 
$s = fopen("php://input", "r"); 

while($kb = fread($s, 1024)) 
{ 
    fwrite($f, $kb, 1024); 
} 
fclose($f); 
fclose($s); 
Header("HTTP/1.1 201 Created"); 

मैं नहीं कर रहा हूँ:

$client_data = file_get_contents("php://input"); 

के बाद से एक चर में पूरी फ़ाइल डाल विशाल फाइल अपलोड करते समय निश्चित रूप से सभी मेमोरी भर जाएगी।

जो चीज़ मैं नहीं समझ सकता वह यह है कि फ़ॉर्म सीमाओं के बिना फ़ाइल डेटा कैसे लिखना है। अभी इसे इस तरह फ़ाइल कुछ के शीर्ष पर लिखते हैं:

------WebKitFormBoundaryVz0ZGHLGxBOCUVQG 
Content-Disposition: form-data; name="file-0"; filename="somename.pdf" 
Content-Type: application/pdf 

और इस तरह नीचे कुछ पर:

------WebKitFormBoundaryVz0ZGHLGxBOCUVQG--  

तो मैं डेटा पार्स करने के लिए की जरूरत है। लेकिन इसके लिए मुझे पूरी डेटा स्ट्रीम को स्मृति में और बड़ी वीडियो फ़ाइलों के साथ पढ़ने की ज़रूरत है, मैं ऐसा नहीं करना चाहता हूं। मैंने शायद एक php: // temp स्ट्रीम बनाने के बारे में कुछ पढ़ा था। लेकिन इसके साथ अभी तक कोई भाग्य नहीं है। सीमा शीर्षलेख के बिना, मैं केवल एक फ़ाइल को सामग्री कैसे लिख सकता हूं? और पहले बिना किसी चर में सभी डेटा पंपिंग?

+0

क्या आप 'सामग्री-प्रकार' शीर्षलेख प्रदान कर सकते हैं? –

उत्तर

1

शायद fgets का एक संयोजन एक नई पंक्ति पर पढ़ रहे हैं और सीमाओं के लिए जाँच को रोकने के लिए:

while($kb = fgets($s, 1024)) 
{ 
    if(strpos($kb, '------') === false) //or !== 0 for first position 
    { 
     fwrite($f, $kb, 1024); 
    } 
} 
+0

लेकिन यह सुनिश्चित करने के लिए कि '-----' को एक ही हिस्से में शामिल किया गया है? क्या होगा यदि '---' पहले खंड के अंत में शामिल है और '---' - यह दूसरी की शुरुआत है? या यह मामला नहीं हो सकता है? – Tamara

+0

'fgets' लाइन' \ n' के अंत तक पढ़ता है, इसलिए - अगली पंक्ति की शुरुआत में होगा। – AbraCadaver

+0

यदि ऐसा है, तो निम्न शीर्षकों के साथ क्या होगा? वे फ़ाइल को भी नुकसान पहुंचाएंगे। –

1

आप उपयोग कर सकते हैं this (वहाँ यह जैसे कई हैं)। यह खंडित अपलोड का समर्थन करता है जिसका अर्थ है कि आप किसी भी पोस्ट/फ़ाइल अधिकतम आकार को तब तक नहीं दबाएंगे जब तक प्रत्येक अपलोड खंड पोस्ट अधिकतम आकार से कम न हो।

इसमें PHP code भी शामिल है, आपको सर्वर की तरफ आवश्यकता होगी।

+0

मैं उन ब्लूंप अपलोडर का उपयोग उन साइटों पर करता हूं जिनमें बहुत से अपलोड की गई फाइलें थीं और यह मेरे उपयोगकर्ताओं के लिए अच्छी तरह से काम करती थी। –

0

पहिया को फिर से बनाने की कोई आवश्यकता नहीं है। बस POST का उपयोग करें और PHP की कॉन्फ़िगरेशन को बड़ी सीमाओं में बदलें। उन सीमाओं को प्रति निर्देशिका/मेजबान आधार पर भी सेट किया जा सकता है।

.htaccess या अपने apache.conf

php_value upload_max_filesize 10G 
php_value post_max_size 10G 

यह भी max_input_time की तरह, अन्य सीमा समायोजित करने के लिए एक अच्छा विचार है का उपयोग करना।

किसी भी अतिरिक्त काम से बचने के लिए move_uploaded_file का उपयोग करके प्राप्त फ़ाइल को स्थानांतरित करना न भूलें।