yii2
Datei-Uploads
Suche…
Wie es geht
Dateien hochladen
Das Hochladen von Dateien in Yii erfolgt normalerweise mit Hilfe von [[yii \ web \ UploadedFile]], die jede hochgeladene Datei als UploadedFile
Objekt kapselt. In Kombination mit [[yii \ widgets \ ActiveForm]] und Modellen können Sie problemlos einen sicheren Mechanismus zum Hochladen von Dateien implementieren.
Modelle erstellen
Wie beim Arbeiten mit Klartexteingaben würden Sie zum Hochladen einer einzelnen Datei eine Modellklasse erstellen und ein Attribut des Modells verwenden, um die hochgeladene Dateiinstanz beizubehalten. Sie sollten auch eine Validierungsregel deklarieren, um den Upload der Datei zu überprüfen. Zum Beispiel,
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; } } }
Im obigen Code wird das imageFile
Attribut verwendet, um die hochgeladene imageFile
. Es ist mit einer zugehörigen file
, die verwendet [[yii \ Validatoren \ FileValidator]] , um eine Datei mit der Erweiterung Namen , um sicherzustellen , png
oder jpg
hochgeladen. Die upload()
-Methode führt die Validierung durch und speichert die hochgeladene Datei auf dem Server.
Der file
- Validator können Sie Dateierweiterungen, Größe, MIME - Typ, usw. Bitte beachten Sie die Core - Validatoren Abschnitt , um weitere Informationen zu überprüfen.
Tipp: Wenn Sie ein Bild hochladen, können Sie prüfen, die unter Verwendung von
image
statt Validator. Derimage
Validator wird über [[yii \ validators \ ImageValidator]] implementiert, der überprüft, ob ein Attribut ein gültiges Image erhalten hat, das entweder gespeichert oder mit der Imagine-Erweiterung verarbeitet werden kann.
Rendern von Dateieingaben
Als Nächstes erstellen Sie eine Dateieingabe in einer Ansicht:
<?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
Sie, dass Sie die Option enctype
zum Formular hinzufügen, damit die Datei ordnungsgemäß hochgeladen werden kann. Der Aufruf fileInput()
gibt ein Tag <input type="file">
dem Benutzer eine hochzuladende Datei auswählen können.
Tipp: seit Version 2.0.8 [[yii \ web \ Widgets \ ActiveField :: FileInput- | FileInput-]] fügt
enctype
Option in das Formular automatisch , wenn Dateieingabefeld verwendet wird.
Verdrahtung
Schreiben Sie nun in einer Controller-Aktion den Code, um das Modell zu verkabeln und die Ansicht, um das Hochladen von Dateien zu implementieren:
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]); } }
Wenn im obigen Code das Formular gesendet wird, wird die Methode [[yii \ web \ UploadedFile :: getInstance ()]] aufgerufen, um die hochgeladene Datei als UploadedFile
Instanz darzustellen. Wir verlassen uns dann auf die Modellvalidierung, um sicherzustellen, dass die hochgeladene Datei gültig ist, und die Datei auf dem Server speichern.
Mehrere Dateien hochladen
Sie können auch mehrere Dateien gleichzeitig hochladen, wobei der Code in den vorherigen Unterabschnitten angepasst wurde.
Zuerst sollten Sie die Modellklasse anpassen , indem Sie das Hinzufügen maxFiles
Option in der file
Gültigkeitsregel die maximale Anzahl von Dateien zu begrenzen , erlaubt zu. Wenn Sie maxFiles
auf 0
, ist die Anzahl der Dateien, die gleichzeitig hochgeladen werden können, unbegrenzt. Die maximale Anzahl von Dateien, die gleichzeitig hochgeladen werden dürfen, ist auch mit der PHP-Direktive max_file_uploads
begrenzt. Die max_file_uploads
ist 20. Die upload()
-Methode sollte auch aktualisiert werden, um die hochgeladenen Dateien einzeln zu speichern.
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 der Ansichtsdatei sollten Sie dem Aufruf von fileInput()
die Option multiple
hinzufügen, damit das Feld zum Hochladen von Dateien mehrere Dateien empfangen kann:
<?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() ?>
Und schließlich sollten Sie in der Controller-Aktion UploadedFile::getInstances()
anstelle von UploadedFile::getInstance()
UploadForm::imageFiles
um UploadForm::imageFiles
ein Array von UploadedFile
Instanzen 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]); } }