yii2
फ़ाइल अपलोड
खोज…
यह कैसे करना है
फ़ाइलें अपलोड कर रहा है
Yii में फ़ाइलें अपलोड करना आमतौर पर [[yii \ web \ UploadedFile]] की सहायता से किया जाता है, जो प्रत्येक अपलोड की UploadedFile
फ़ाइल को UploadedFile
ऑब्जेक्ट के रूप में UploadedFile
है। [[Yii \ widgets \ ActiveForm]] और मॉडल के साथ संयुक्त, आप आसानी से एक सुरक्षित फ़ाइल अपलोडिंग तंत्र को लागू कर सकते हैं।
मॉडल बनाना
सादे पाठ इनपुट के साथ काम करने की तरह, एक एकल फ़ाइल अपलोड करने के लिए आप एक मॉडल वर्ग बनाएंगे और अपलोड की गई फ़ाइल को रखने के लिए मॉडल की विशेषता का उपयोग करेंगे। फ़ाइल अपलोड को मान्य करने के लिए आपको एक सत्यापन नियम भी घोषित करना चाहिए। उदाहरण के लिए,
namespace app\models; use yii\base\Model; use yii\web\UploadedFile; class UploadForm extends Model { /** * @var UploadedFile */ public $imageFile; public function rules() { return [ [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'], ]; } public function upload() { if ($this->validate()) { $this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension); return true; } else { return false; } } }
ऊपर दिए गए कोड में, imageFile
विशेषता का उपयोग अपलोड की गई फ़ाइल आवृत्ति को रखने के लिए किया जाता है। यह एक file
सत्यापन नियम के साथ जुड़ा हुआ है जो एक्सटेंशन नाम png
या jpg
अपलोड होने के साथ फाइल सुनिश्चित करने के लिए [[yii \ validators \ FileValidator]] का उपयोग करता है। upload()
विधि सत्यापन करेगा और अपलोड की गई फ़ाइल को सर्वर पर बचाएगा।
file
सत्यापनकर्ता आपको फ़ाइल एक्सटेंशन, आकार, माइम प्रकार, आदि की जांच करने की अनुमति देता है। कृपया अधिक विवरण के लिए मुख्य सत्यापनकर्ता अनुभाग देखें।
युक्ति: यदि आप एक छवि अपलोड कर रहे हैं, तो आप इसके बजाय
image
सत्यापनकर्ता का उपयोग करने पर विचार कर सकते हैं।image
सत्यापनकर्ता को [[yii \ validators \ ImageValidator]] के माध्यम से कार्यान्वित किया जाता है, जो पुष्टि करता है कि यदि किसी विशेषता को एक वैध छवि प्राप्त हुई है, जिसे इमेज एक्सटेंशन के उपयोग से सहेजा या संसाधित किया जा सकता है।
फ़ाइल इनपुट रेंडर करना
अगला, एक दृश्य में एक फ़ाइल इनपुट बनाएं:
<?php use yii\widgets\ActiveForm; ?> <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> <?= $form->field($model, 'imageFile')->fileInput() ?> <button>Submit</button> <?php ActiveForm::end() ?>
यह याद रखना महत्वपूर्ण है कि आप फ़ॉर्म में enctype
विकल्प जोड़ते हैं ताकि फ़ाइल को ठीक से अपलोड किया जा सके। fileInput()
कॉल एक <input type="file">
टैग को प्रस्तुत करेगा जो उपयोगकर्ताओं को अपलोड करने के लिए फ़ाइल का चयन करने की अनुमति देगा।
युक्ति: संस्करण 2.0.8 के बाद से, [[yii \ web \ widgets \ ActiveField :: fileInput | fileInput]] फ़ाइल इनपुट फ़ील्ड का उपयोग करने पर स्वचालित रूप से
enctype
विकल्प जोड़ता है।
वायरिंग अप
अब एक कंट्रोलर एक्शन में, मॉडल को वायर करने के लिए कोड और फाइल अपलोडिंग को लागू करने के लिए दृश्य लिखें:
namespace app\controllers; use Yii; use yii\web\Controller; use app\models\UploadForm; use yii\web\UploadedFile; class SiteController extends Controller { public function actionUpload() { $model = new UploadForm(); if (Yii::$app->request->isPost) { $model->imageFile = UploadedFile::getInstance($model, 'imageFile'); if ($model->upload()) { // file is uploaded successfully return; } } return $this->render('upload', ['model' => $model]); } }
उपरोक्त कोड में, जब फॉर्म सबमिट किया जाता है, तो [[yii \ web \ UploadedFile :: getInstance ()]] विधि अपलोड की UploadedFile
फ़ाइल को UploadedFile
उदाहरण के रूप में दर्शाने के लिए कहा जाता है। हम तब मॉडल सत्यापन पर भरोसा करते हैं ताकि यह सुनिश्चित हो सके कि अपलोड की गई फाइल वैध है और फाइल को सर्वर पर सहेजना है।
एकाधिक फ़ाइलों को अपलोड करना
आप एक बार में कई फ़ाइलों को अपलोड कर सकते हैं, पिछले समायोजन में सूचीबद्ध कोड के लिए कुछ समायोजन के साथ।
सबसे पहले आपको अपलोड करने की अनुमति दी गई फ़ाइलों की अधिकतम संख्या को सीमित करने के लिए file
सत्यापन नियम में maxFiles
विकल्प को जोड़कर मॉडल वर्ग को समायोजित करना चाहिए। maxFiles
को 0
सेट करने का मतलब है कि एक साथ अपलोड की जा सकने वाली फाइलों की संख्या की कोई सीमा नहीं है। एक साथ अपलोड करने की अनुमति दी गई फ़ाइलों की अधिकतम संख्या भी पीएचपी डायरेक्टिव max_file_uploads
साथ सीमित है, जो 20 तक चूक जाती है। अपलोड की गई फ़ाइलों को एक-एक करके सहेजने के लिए upload()
विधि को भी अपडेट किया जाना चाहिए।
namespace app\models; use yii\base\Model; use yii\web\UploadedFile; class UploadForm extends Model { /** * @var UploadedFile[] */ public $imageFiles; public function rules() { return [ [['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 4], ]; } public function upload() { if ($this->validate()) { foreach ($this->imageFiles as $file) { $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension); } return true; } else { return false; } } }
दृश्य फ़ाइल में, आपको fileInput()
कॉल में multiple
विकल्प जोड़ना चाहिए ताकि फ़ाइल अपलोड फ़ील्ड कई फ़ाइलों को प्राप्त कर सके:
<?php use yii\widgets\ActiveForm; ?> <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> <?= $form->field($model, 'imageFiles[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?> <button>Submit</button> <?php ActiveForm::end() ?>
और अंत में नियंत्रक कार्रवाई में, आपको UploadedFile::getInstances()
बजाय UploadedFile::getInstance()
UploadForm::imageFiles
UploadedFile
इंस्टेंस की एक सरणी असाइन करने के लिए कॉल करना चाहिए।
namespace app\controllers; use Yii; use yii\web\Controller; use app\models\UploadForm; use yii\web\UploadedFile; class SiteController extends Controller { public function actionUpload() { $model = new UploadForm(); if (Yii::$app->request->isPost) { $model->imageFiles = UploadedFile::getInstances($model, 'imageFiles'); if ($model->upload()) { // file is uploaded successfully return; } } return $this->render('upload', ['model' => $model]); } }