yii2
Bestandsuploads
Zoeken…
Hoe je dat doet
Bestanden uploaden
Het uploaden van bestanden in Yii gebeurt meestal met behulp van [[yii \ web \ UploadedFile]] dat elk geüpload bestand als een UploadedFile
object inkapselt. Gecombineerd met [[yii \ widgets \ ActiveForm]] en modellen, kunt u eenvoudig een veilig mechanisme voor het uploaden van bestanden implementeren.
Modellen maken
Als u met gewone tekstinvoer werkt, zou u om een enkel bestand te uploaden een modelklasse maken en een kenmerk van het model gebruiken om de geüploade bestandsinstantie te behouden. U moet ook een validatieregel declareren om de bestandsupload te valideren. Bijvoorbeeld,
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; } } }
In de bovenstaande code wordt het kenmerk imageFile
gebruikt om de geüploade bestandsinstantie te behouden. Het is gekoppeld aan een file
die [[yii \ validators \ FileValidator]] gebruikt om te zorgen dat een bestand met de extensienaam png
of jpg
wordt geüpload. De upload()
-methode voert de validatie uit en slaat het geüploade bestand op de server op.
Met de file
kunt u bestandsextensies, grootte, MIME-type, enz. Controleren. Raadpleeg het gedeelte Kernvalidators voor meer informatie.
Tip: als u een afbeelding uploadt, kunt u overwegen de
image
gebruiken. Deimage
wordt geïmplementeerd via [[yii \ validators \ ImageValidator]] die verifieert of een attribuut een geldige afbeelding heeft ontvangen die vervolgens kan worden opgeslagen of verwerkt met behulp van de Imagine Extension .
Rendering Bestand Invoer
Maak vervolgens een bestandsinvoer in een weergave:
<?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() ?>
Het is belangrijk om te onthouden dat u de optie enctype
aan het formulier toevoegt, zodat het bestand correct kan worden geüpload. De fileInput()
geeft een tag <input type="file">
weer waarmee gebruikers een bestand kunnen selecteren om te uploaden.
Tip: sinds versie 2.0.8, [[yu \ web \ widgets \ ActiveField :: fileInput | fileInput]] voegt
enctype
optie om het formulier automatisch wanneer bestand invoerveld wordt gebruikt.
Bedrading
Schrijf nu in een controlleractie de code om het model te verbinden en de weergave om het uploaden van bestanden te implementeren:
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]); } }
In de bovenstaande code wordt bij het indienen van het formulier de methode [[yii \ web \ UploadedFile :: getInstance ()]] aangeroepen om het geüploade bestand als een UploadedFile
instantie weer te geven. We vertrouwen vervolgens op de modelvalidatie om te controleren of het geüploade bestand geldig is en slaan het bestand op de server op.
Meerdere bestanden uploaden
U kunt ook meerdere bestanden tegelijk uploaden, met enkele aanpassingen aan de code die in de vorige paragrafen wordt vermeld.
Eerst moet u de maxFiles
aanpassen door de optie maxFiles
toe te voegen aan de file
om het maximale aantal bestanden te beperken dat mag worden geüpload. Als u maxFiles
op 0
maxFiles
is er geen limiet op het aantal bestanden dat tegelijkertijd kan worden geüpload. Het maximale aantal bestanden dat tegelijkertijd mag worden geüpload, is ook beperkt met de PHP-richtlijn max_file_uploads
, standaard ingesteld op 20. De upload()
-methode moet ook worden bijgewerkt om de geüploade bestanden een voor een op te slaan.
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; } } }
In het weergavebestand moet u de optie multiple
toevoegen aan de fileInput()
zodat het veld voor het uploaden van bestanden meerdere bestanden kan ontvangen:
<?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() ?>
En ten slotte moet u in de controlleractie UploadedFile::getInstances()
plaats van UploadedFile::getInstance()
UploadForm::imageFiles
om een reeks UploadedFile
instanties toe te UploadForm::imageFiles
aan UploadForm::imageFiles
.
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]); } }