Ricerca…


Come farlo

Caricamento di file

Il caricamento dei file in Yii avviene di solito con l'aiuto di [[yii \ web \ UploadedFile]] che incapsula ogni file caricato come oggetto UploadedFile . In combinazione con [[yii \ widgets \ ActiveForm]] e modelli, è possibile implementare facilmente un meccanismo di caricamento sicuro dei file.

Creazione di modelli

Come quando si utilizzano input di testo normale, per caricare un singolo file si crea una classe del modello e si utilizza un attributo del modello per mantenere l'istanza del file caricato. Devi anche dichiarare una regola di convalida per convalidare il caricamento del file. Per esempio,

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

Nel codice sopra, l'attributo imageFile viene utilizzato per mantenere l'istanza del file caricato. È associato a una regola di convalida dei file che utilizza [[yii \ validators \ FileValidator]] per garantire che un file con estensione nome png o jpg sia caricato. Il metodo upload() eseguirà la convalida e salverà il file caricato sul server.

Il validatore di file ti consente di controllare le estensioni dei file, le dimensioni, il tipo MIME, ecc. Per ulteriori dettagli, fai riferimento alla sezione Validatori di base.

Suggerimento: se stai caricando un'immagine, puoi prendere in considerazione l'utilizzo del validatore di image . Il validatore di image è implementato tramite [[yii \ validators \ ImageValidator]] che verifica se un attributo ha ricevuto un'immagine valida che può essere quindi salvata o elaborata utilizzando l' estensione Imagine .

Input del file di rendering

Successivamente, crea un input di file in una vista:

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

È importante ricordare che si aggiunge l'opzione enctype al modulo in modo che il file possa essere caricato correttamente. La chiamata fileInput() eseguirà il rendering di un <input type="file"> che consentirà agli utenti di selezionare un file da caricare.

Suggerimento: dalla versione 2.0.8, [[yii \ web \ widgets \ ActiveField :: fileInput | fileInput]] aggiunge enctype opzione enctype al modulo quando viene utilizzato il campo di input del file.

Cablaggio

Ora in un'azione controller, scrivi il codice per collegare il modello e la vista per implementare il caricamento dei file:

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

Nel codice precedente, quando viene inviato il modulo, viene chiamato il metodo [[yii \ web \ UploadedFile :: getInstance ()]] per rappresentare il file caricato come istanza di UploadedFile . Ci affidiamo quindi alla convalida del modello per assicurarci che il file caricato sia valido e salvare il file sul server.

Caricamento di più file

Puoi anche caricare più file contemporaneamente, con alcune modifiche al codice elencato nelle sottosezioni precedenti.

Innanzitutto è necessario regolare la classe del modello aggiungendo l'opzione maxFiles nella regola di convalida dei file per limitare il numero massimo di file consentiti per il caricamento. L'impostazione di maxFiles su 0 significa che non esiste un limite al numero di file che possono essere caricati simultaneamente. Il numero massimo di file che possono essere caricati simultaneamente è anche limitato dalla direttiva PHP max_file_uploads , che ha valore predefinito 20. Il metodo upload() dovrebbe anche essere aggiornato per salvare i file caricati uno per uno.

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

Nel file di visualizzazione, è necessario aggiungere l'opzione multiple alla chiamata fileInput() modo che il campo di caricamento del file possa ricevere più file:

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

Infine, nell'azione del controller, è necessario chiamare UploadedFile::getInstances() anziché UploadedFile::getInstance() per assegnare un array di istanze di UploadedFile a 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow