Recherche…


Comment faire

Téléchargement de fichiers

Le téléchargement de fichiers en Yii se fait généralement à l'aide de [[yii \ web \ UploadedFile]] qui encapsule chaque fichier téléchargé en tant qu'objet UploadedFile . Combiné avec [[yii \ widgets \ ActiveForm]] et les modèles, vous pouvez facilement implémenter un mécanisme de téléchargement de fichiers sécurisé.

Créer des modèles

Comme pour travailler avec des entrées de texte brut, pour télécharger un seul fichier, vous devez créer une classe de modèle et utiliser un attribut du modèle pour conserver l'instance de fichier téléchargée. Vous devez également déclarer une règle de validation pour valider le téléchargement du fichier. Par exemple,

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;
        }
    }
}

Dans le code ci-dessus, l'attribut imageFile permet de conserver l'instance du fichier téléchargé. Il est associé à une règle de validation de file qui utilise [[yii \ validators \ FileValidator]] pour garantir qu'un fichier portant le nom d'extension png ou jpg est chargé. La méthode upload() effectuera la validation et enregistrera le fichier téléchargé sur le serveur.

Le validateur de file vous permet de vérifier les extensions de fichiers, la taille, le type MIME, etc. Veuillez vous référer à la section Validateurs du Core pour plus de détails.

Conseil: Si vous téléchargez une image, vous pouvez envisager d'utiliser le validateur d' image place. Le validateur d' image est implémenté via [[yii \ validators \ ImageValidator]] qui vérifie si un attribut a reçu une image valide qui peut ensuite être enregistrée ou traitée à l'aide d' Imagine Extension .

Rendu du fichier d'entrée

Ensuite, créez une entrée de fichier dans une vue:

<?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() ?>

Il est important de se rappeler que vous ajoutez l’option enctype au formulaire pour que le fichier puisse être correctement téléchargé. L'appel fileInput() affichera une <input type="file"> qui permettra aux utilisateurs de sélectionner un fichier à télécharger.

Astuce: depuis la version 2.0.8, [[yii \ web \ widgets \ ActiveField :: fileInput | fileInput]] ajoute automatiquement l'option enctype au formulaire lorsque le champ de saisie du fichier est utilisé.

Le câblage

Maintenant, dans une action de contrôleur, écrivez le code pour câbler le modèle et la vue pour implémenter le téléchargement de fichier:

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

Dans le code ci-dessus, lorsque le formulaire est soumis, la méthode [[yii \ web \ UploadedFile :: getInstance ()]] est appelée pour représenter le fichier téléchargé en tant qu'instance UploadedFile . Nous nous appuyons ensuite sur la validation du modèle pour nous assurer que le fichier téléchargé est valide et enregistrez le fichier sur le serveur.

Téléchargement de plusieurs fichiers

Vous pouvez également télécharger plusieurs fichiers à la fois, avec quelques ajustements au code répertorié dans les sous-sections précédentes.

Vous devez d'abord ajuster la classe de modèle en ajoutant l'option maxFiles dans la règle de validation de file afin de limiter le nombre maximal de fichiers autorisés à télécharger. maxFiles vous maxFiles sur 0 , le nombre de fichiers pouvant être téléchargés simultanément est illimité. Le nombre maximum de fichiers max_file_uploads être téléchargés simultanément est également limité avec la directive PHP max_file_uploads , qui est par défaut à 20. La méthode upload() doit également être mise à jour pour enregistrer les fichiers téléchargés un par un.

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;
        }
    }
}

Dans le fichier de vue, vous devez ajouter l'option multiple à l'appel fileInput() afin que le champ de téléchargement du fichier puisse recevoir plusieurs fichiers:

<?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() ?>

Et enfin, dans l'action du contrôleur, vous devez appeler UploadedFile::getInstances() au lieu de UploadedFile::getInstance() pour affecter un tableau d'instances UploadedFile à 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow