Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)
इस आर्टिकल में, मैं आपको PHP में फाइल अपलोड करने के बेसिक के बारे में बताऊंगा। सबसे पहले, हम PHP के कॉन्फ़िगरेशन ऑप्शन के माध्यम से चलेंगे जिसकी आवश्यकता एक सफलतम फाइल अपलोड के लिए है। इसके बाद, हम एक वास्तविक दुनिया का उदाहरण बनाएंगे की किस प्रकार इस फाइल को अपलोड करें।
PHP की सेटिंग्स को कॉन्फ़िगर करना
कुछ आग PHP कॉन्फ़िगरेशन की सेटिंग है जिसे आप एक सफल फाइल अपलोड से पहले चेक करना चाहेंगे। इस सेक्शन में, हम हर एक ऑप्शन के माध्यम से चलेंगे जोकि PHP फाइल अपलोड करने के लिए महत्वपूर्ण है। यह ऑप्शंस php.in फाइल के अंदर कॉन्फ़िगर हो सकते हैं।
अगर आपको पक्का नहीं है कि php.in फाइल को कहां ढूंढे, तो आप php_ini_loaded_file()
का प्रयोग इसे ढूंढने के लिए कर सकते हैं। सिर्फ अपने सर्वर पर PHP फाइल को बनाएं उसमें नीचे दी गई लाइन डालें और उसके बाद उसे ब्राउज़र में खोलें।
<?php echo php_ini_loaded_file(); ?>
कुछ उपयोगी डिफॉल्ट के साथ यह सेटअप फाइल का एक भाग है।
; Whether to allow HTTP file uploads. file_uploads = On ; Temporary directory for HTTP uploaded files. ; Will use system default if not set. ;upload_tmp_dir = ; Maximum allowed size for uploaded files. upload_max_filesize = 16M ; Maximum number of files that can be uploaded via a single request max_file_uploads = 20 ; Maximum size of POST data that PHP will accept. post_max_size = 20M max_input_time = 60 memory_limit = 128M max_execution_time = 30
Key सेटिंग
file_uploads
file_uploads
डायरेक्टिव की वैल्यू On
पर सेट होनी चाहिए ताकि यह फाइल अपलोड को अनुमति दें। इस डायरेक्टिव की डिफ़ॉल्ट वैल्यू On
होती हैं।
upload_max_filesize
upload_max_filesize
डायरेक्टिव आपको अनुमति देता है कि आप अपलोड की जाने वाली फाइल के अधिकतम साइज को कॉन्फ़िगर कर सके। डिफ़ॉल्ट रूप से, यह 2M
(2 मेगाबाइट) पर सेट होता है, और आप इस सेटिंग को .htaccess फाइल के जरिए भी ओवरराइड कर सकते हैं। आजकल के हिसाब से 2 मेगाबाइट काफी नहीं होता, इसलिए आपको इसे बढ़ाना होगा। जब आप फाइल को अपलोड करने की कोशिश करते हैं तो यदि आपको error मिलता है कि file exceeds upload_max_filesize
, तो आपको इसकी वैल्यू बढ़ाने की जरूरत होगी। यदि आप करते हैं, तो ध्यान रखें की post_max_size
की वैल्यू भी बढ़ाएं (नीचे देखें)।
upload_tmp_dir
टेंपरेरी डायरेक्टरी को सेट करें जिसका उपयोग अपलोड की गई फाइल को स्टोर करने के लिए किया जाएगा। अधिकतम मामलों में, आपको इस सैटिंग्स के बारे में चिंता करने की जरूरत नहीं है। यदि आप इसे चेक नहीं करते, तो सिस्टम की डिफॉल्ट temp डायरेक्टरी प्रयोग किया जाएगा।
post_max_size
post_max_size
डायरेक्टिव आपको POST डाटा के अधिकतम साइज को कॉन्फ़िगर करने की अनुमति देता है। क्योंकि फाइल्स को POST रिक्वेस्ट द्वारा अपलोड किया जाता है, यह वैल्यू आपके upload_max_filesize
डायरेक्टिव में सेट की गई वैल्यू से अधिक होनी चाहिए। उदाहरण के लिए, यदि आपके upload_max_filesize
में 16M
(16 megabytes) है, तो शायद आप post_max_size
को 20M
पर सेट करना चाहेंगे।
max_file_uploads
यह एक बार में अधिकतम फाइलों की संख्या जिन्हें हम अपलोड कर सकते हैं को सेट करने की अनुमति देता है। डिफॉल्ट 20
होता है, यह एक समझदारी भरी संख्या है।
max_input_time
यह सेकण्ड्स की अधिकतम संख्या होती है जिसमें एक स्क्रिप्ट को इनपुट डाटा parse करने की अनुमति होती है। आपको इसे रीजनेबल वैल्यू में सेट करना चाहिए यदि आप एक बड़ी फाइल को अपलोड करना चाहते हैं। 60
(60 सेकण्ड्स) ज्यादातर एप्लीकेशंस के लिए एक अच्छी वैल्यू हो सकती है।
memory_limit
memory_limit
डायरेक्टिव यह बताता है की स्क्रिप्ट ज्यादा से ज्यादा कितनी मेमोरी का प्रयोग कर सकती है। यदि आप एक बड़ी फाइल को अपलोड करने के दौरान किसी समस्या का सामना कर रहे हैं, तो आपको यह पक्का करना होगा कि इस डायरेक्टिव की वैल्यू post_max_size
डायरेक्टिव में सेट की गई वैल्यू से अधिक होनी चाहिए। डिफॉल्ट वैल्यू 128M
(128 megabytes) है, तो जब तक कि आपके पास बहुत बड़ा post_max_size
और upload_max_filesize
नहीं है, आपको इसकी चिंता करने की जरूरत नहीं है।
max_execution_time
यह सेकंड की अधिकतम संख्या है जिस पर यह एक स्क्रिप्ट चलाने की अनुमति देता है। यदि किसी बड़ी फाइल को अपलोड करते समय आपको कोई समस्या का सामना करना पड़े, तो आप इसकी वैल्यू को बढ़ाने के बारे में सोच सकते हैं। 30
(30 seconds) को ज्यादातर एप्लीकेशन के साथ अच्छे से काम करना चाहिए।
चलिए अब हम एक वास्तविक दुनिया के उदाहरण को बनाते हैं जिससे PHP में फाइल अपलोड को दिखा सकें।
HTML का फॉर्म बनाना
एक बार जब आप PHP सेटिंग को कॉन्फ़िगर कर लेते हैं, आप PHP फाइल की अपलोड करने की क्षमता को ट्राई करने के लिए तैयार हैं।
हमारे GitHub रेपो में कुछ सैंपल कोड है जिनके बारे में मैं इस पूरे आर्टिकल के दौरान बात करूंगा। इसलिए, यदि आप इसके साथ चलना चाहते हैं, आगे बढ़िए और GitHub से इसे डाउनलोड कर लीजिए।
हम दो PHP फाइलें बनाने जा रहे हैं: index.php और upload.php। index.php फाइल उन कोड्स को रखती है जो फाइल अपलोड फॉर्म को दिखाने के लिए रिस्पांसिबल है। दूसरी तरफ, upload.php फाइल फाइल को सर्वर पर अपलोड करने के लिए रिस्पांसिबल है।
साथ ही साथ, फाइल को uploaded_files डायरेक्टरी में अपलोड कर दिया जाएगा, इसलिए यदि आप यह पक्का करना चाहते हैं कि यह फोल्डर मौजूद है और web-server
यूजर के द्वारा राइटेबल है।
इस सेक्शन में, हम index.php फाइल के key पार्ट्स के माध्यम से चलेंगे।
आइए GitHub पर index.php फाइल पर एक नजर डालें:
<?php session_start(); ?> <!DOCTYPE html> <html> <head> <title>PHP File Upload</title> </head> <body> <?php if (isset($_SESSION['message']) && $_SESSION['message']) { printf('<b>%s</b>', $_SESSION['message']); unset($_SESSION['message']); } ?> <form method="POST" action="upload.php" enctype="multipart/form-data"> <div> <span>Upload a File:</span> <input type="file" name="uploadedFile" /> </div> <input type="submit" name="uploadBtn" value="Upload" /> </form> </body> </html>
हालांकि यह एक टिपिकल PHP फॉर्म की तरह नजर आ सकता है, पर यहां <form>
टैग के enctype
एट्रिब्यूट की वैल्यू में एक महत्वपूर्ण अंतर है। इसे multipart/form-data
और सेट किए जाने की आवश्यकता है क्योंकि फॉर्म में फाइल फील्ड शामिल है।
enctype
एट्रिब्यूट इनकोडिंग के टाइप को बताता है जिसे तब प्रयोग किया जाना चाहिए जब फॉर्म को सबमिट किया जाता है, और यह नीचे दी गई 3 वैल्यू में से किसी एक को लेता है।
-
application/x-www.form-urlencoded
: यह डिफॉल्ट वैल्यू है जब आपenctype
एट्रिब्यूट में अलग से कोई वेल्यू सेट नहीं करते। इस स्थिति में अक्षरों को सर्वर पर भेजने से पहले एनकोड किया जाता है। यदि आपके फॉर्म में फाइल फील्ड नहीं है, तो आप कोenctype
एट्रिब्यूट में इसी वैल्यू का प्रयोग करना चाहिए। -
multipart/form-data
: जब आपenctype
एट्रिब्यूट के लिएmultipart/form-data
वैल्यू का प्रयोग करते है, यह आपको POST मेथड द्वारा फाइल अपलोड करने की अनुमति देता है। साथ ही, यह पक्का करता है कि जब फॉर्म को सबमिट किया जाता है तब अक्षरों को एनकोड नहीं किया जाता। -
text/plain
: इसे आमतौर पर प्रयोग नहीं किया जाता। इस सेटिंग के साथ, डाटा को बिना इनकोडिंग के भेजा जाता है।
इसके बाद, हम फाइल फील्ड को आउटपुट करते हैं, जो हमें हमारे कंप्यूटर में से फाइल को सिलेक्ट करने की अनुमति देता है।
<input type="file" name="uploadedFile" />
इससे अलग, हमने फॉर्म के सबसे ऊपर एक मैसेज को डिस्प्ले किया है। यह मैसेज अपलोड फाइल के स्टेटस को दिखाता है, और यह सेशन वेरिएबल में upload.php स्क्रिप्ट के द्वारा सेट कर दिया जाएगा। हम इसके बारे में और अधिक अगले सेक्शन में देखेंगे।
<?php if (isset($_SESSION['message']) && $_SESSION['message']) { printf('<b>%s</b>', $_SESSION['message']); unset($_SESSION['message']); } ?>
तो यह index.php फाइल के बारे में सब कुछ है। अगले सेक्शन में हम देखेंगे कि सर्वर साइड में अपलोड की गई फाइल को किस प्रकार हैंडल करें।
अपलोड लॉजिक को बनाएं
पिछले सेक्शन में, हमने HTML फॉर्म को बनाया जो क्लाइंट साइड में दिखाया जाएगा और यह आपको आपके कंप्यूटर से फाइल अपलोड करने की अनुमति देता है। इस सेक्शन में, हम देखेंगे सर्वर साइड के हिस्से को जो आपको अपलोड की गई फाइल को हैंडल करने की अनुमति देता है।
GitHub मैं से upload.php फाइल के कोड को निकाले। हम इस फाइल के महत्वपूर्ण हिस्सों के माध्यम से चलेंगे।
upload.php फाइल में, हमने सबसे पहले चेक किया कि क्या यह एक वैलिड POST रिक्वेस्ट है।
if (isset($_POST['uploadBtn']) && $_POST['uploadBtn'] == 'Upload') { ... }
PHP में, जब फाइल अपलोड की जाती है, $_FILES
सुपर ग्लोबल वेरिएबल पॉप्युलेट होता है जिसमें अपलोड की गई फाइल के बारे में सभी जानकारी होती है। इसे array के रूप में इनिशियलाइज़ किया जाता है और एक सफल फाइल अपलोड के लिए इसमें निम्न जानकारी होती है।
-
tmp_name
: टेंपरेरी फाइल जहां अपलोड की गई फाइल को स्टोर किया जाता है इस वेरिएबल में होता है। -
name
: फाइल का असली नाम इस वेरिएबल में स्टोर किया जाता है। -
size
: अपलोड की गई फाइल को बाइट में इंडिकेट करता है। -
type
: इसमें अपलोड की गई फाइल का mime टाइप शामिल होता है। -
error
: यदि फाइल अपलोड करते समय कोई error आता है, यह वेरिएबल उपयुक्त error मैसेज के साथ पॉप्युलेट होता है।एक सफल फाइल अपलोड की स्थिति में, इसमें जीरो होता है, जिसकी आपUPLOAD_ERR_OK
कांस्टेंट के साथ तुलना कर सकते हैं।
POST रिक्वेस्ट को वैलिडेट करने के बाद, हम चेक करते हैं कि फाइल अपलोड सफल है।
if (isset($_FILES['uploadedFile']) && $_FILES['uploadedFile']['error'] === UPLOAD_ERR_OK) { ... }
आप देख सकते हैं कि $_FILES
वेरिएबल एक मल्टीडाइमेंशनल array है, पहला एलिमेंट फाइल फील्ड का नाम है और दूसरे एलिमेंट में अपलोड की गई फाइल की जानकारी है, जिसके बारे में अभी हमने ऊपर पढ़ा।
यदि फाइल अपलोड सफल हो गया, हम कुछ वेरिएबल को अपलोड की गई फाइल की जानकारी के साथ इनिशियलाइज़ करेंगे।
// get details of the uploaded file $fileTmpPath = $_FILES['uploadedFile']['tmp_name']; $fileName = $_FILES['uploadedFile']['name']; $fileSize = $_FILES['uploadedFile']['size']; $fileType = $_FILES['uploadedFile']['type']; $fileNameCmps = explode(".", $fileName); $fileExtension = strtolower(end($fileNameCmps));
ऊपर वाले स्निपेट में, हमने अपलोड की गई फाइल की एक्सटेंशन का भी पता लगाया और इसे $fileExtension
वेरिएबल में स्टोर कर दिया।
अपलोड की गई फाइल में शायद spaces और कुछ स्पेशल कैरक्टर शामिल हो सकते हैं, फाइल के नाम को सैनिटाइज करना बेहतर रहेगा, और यही चीज हमने अगली स्निपेट में किया है।
$newFileName = md5(time() . $fileName) . '.' . $fileExtension;
यह महत्वपूर्ण है कि आप फाइल के टाइप को सीमित करें जोकि कुछ खास एक्सटेंशन के साथ ही अपलोड की जा सकती है और अपलोड फॉर्म द्वारा सब कुछ अपलोड नहीं करेगी। हमने यह अपलोड फाइल के एक्सटेंशन को एक्सटेंशन के एक सेट के साथ चेक करके कर लिया है। यह वह एक्सटेंशन है जिन्हें हम अपलोड करने की अनुमति देते हैं।
$allowedfileExtensions = array('jpg', 'gif', 'png', 'zip', 'txt', 'xls', 'doc'); if (in_array($fileExtension, $allowedfileExtensions)) { ... }
अंत में, हमने अपलोड की गई फाइल को हमारे द्वारा चुनी गई किसी खास लोकेशन में ले जाने के लिए move_uploaded_file
फंक्शन का प्रयोग किया।
// directory in which the uploaded file will be moved $uploadFileDir = './uploaded_files/'; $dest_path = $uploadFileDir . $newFileName; if(move_uploaded_file($fileTmpPath, $dest_path)) { $message ='File is successfully uploaded.'; } else { $message = 'There was some error moving the file to upload directory. Please make sure the upload directory is writable by web server.'; }
move_uploaded_file
फंक्शन दो आर्ग्यूमेंट्स को लेता है। पहला आर्गुमेंट अपलोड की जाने वाली फाइल का नाम होता है, और दूसरा आर्गुमेंट में डेस्टिनेशन का पाथ होता है जहां आप अपनी फाइल को ले जाना चाहते हैं।
अंत में, हम यूजर को index.php फाइल में रीडायरेक्ट करते हैं। साथ ही साथ, हम उपयुक्त मैसेज को सेशन वेरिएबल में सेट करते हैं, जो यूजर्स को index.php फाइल में रीडायरेक्ट करने के बाद दिखाया जाएगा।
यह सब एक साथ मिलकर कैसे काम करते हैं
upload_files डायरेक्टरी को बनाना ना भूले और इसे web-server यूजर के द्वारा राइटेबल बनाएं। इसके बाद, आगे बढ़े और index.php फाइल को चलाएं, जिसे कुछ इस प्रकार का फाइल अपलोड फॉर्म दिखाना चाहिए:



Browse बटन पर क्लिक करें- जिसे एक डायलॉग बॉक्स ओपन करना चाहिए जो आपको आपके कंप्यूटर में से एक फाइल सिलेक्ट करने की अनुमति देता है, और Upload बटन पर क्लिक कर दीजिए।
इसे आपका फॉर्म सबमिट कर देना चाहिए, और यदि सब कुछ अच्छे से हुआ, आपको अपलोड की गई फाइल uploaded_files डायरेक्टरी के अंदर दिखनी चाहिए। आप दूसरी फाइल्स को भी अपलोड करने की कोशिश कर सकते हैं जिनके एक्सटेंशन स्वीकृत नहीं है, और पता लगाएं कि क्या हमारी स्क्रिप्ट ऐसे अपलोड को रोक रही है।
निष्कर्ष
आज, हमने PHP के फाइल अपलोड के बेसिक के बारे में बात की। इस आर्टिकल के पहले हिस्से में, हमने अलग-अलग कॉन्फ़िगरेशन ऑप्शन के बारे में बात की जिनकी फाइल अपलोड के काम में हमें आवश्यकता है। इसके बाद हमने वास्तविक दुनिया के उदाहरण को देखा जो दिखाता है की PHP में फाइल अपलोड किस तरह काम करता है।
मुझे उम्मीद है आपको इस आर्टिकल में मजा आया होगा, और अपने प्रश्न और सुझावों को नीचे देने में स्वतंत्र महसूस कीजिए!