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. De image 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]);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow