Sök…


Hur man gör det

Ladda upp filer

Överföring av filer i Yii görs vanligtvis med hjälp av [[yii \ web \ UploadedFile]] som kapslar in varje uppladdad fil som ett UploadedFile objekt. Kombinerat med [[yii \ widgets \ ActiveForm]] och modeller kan du enkelt implementera en säker mekanism för överföring av filer.

Skapa modeller

Som att arbeta med inmatningar av vanlig text, för att ladda upp en enda fil skulle du skapa en modellklass och använda ett attribut för modellen för att behålla den uppladdade filinstansen. Du bör också förklara en valideringsregel för att validera filöverföringen. Till exempel,

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

I koden ovan används imageFile attributet för att behålla den uppladdade filinstansen. Det är förenat med en file valideringsregel som användningsområden [[Yii \ mekanismerna \ FileValidator]] för att säkerställa en fil med ändelsen namn png eller jpg laddas upp. Metoden upload() utför valideringen och sparar den överförda filen på servern.

Den file validator kan du kontrollera filnamnstillägg, storlek, MIME-typ, etc. Se Core Validators avsnittet för mer information.

Tips: Om du laddar upp en bild kan du överväga att använda image validator istället. Den image validator implementeras via [[Yii \ validatorer \ ImageValidator]], som verifierar om ett attribut har mottagit en giltig bild som kan sedan antingen sparas eller bearbetas med användning av Föreställ Extension .

Rendering File Input

Skapa sedan en filinmatning i en vy:

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

Det är viktigt att komma ihåg att du lägger till enctype alternativet i formuläret så att filen kan laddas upp ordentligt. fileInput() ger en <input type="file"> tagg som gör det möjligt för användare att välja en fil att ladda upp.

Tips: eftersom version 2.0.8 lägger [[yii \ web \ widgets \ ActiveField :: fileInput | fileInput]] till enctype alternativ till formen automatiskt när filinmatningsfältet används.

Anslutning

Skriv nu koden för att koppla upp modellen och vyn för att implementera filöverföring: i en kontrollåtgärd:

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

I koden ovan, när formuläret skickas, kallas metoden [[yii \ web \ UploadedFile :: getInstance ()]] för att representera den överförda filen som en UploadedFile instans. Vi litar sedan på modellvalideringen för att se till att den laddade filen är giltig och spara filen på servern.

Ladda upp flera filer

Du kan också ladda upp flera filer samtidigt, med några justeringar av koden som listas i föregående underavsnitt.

Först bör du justera modellen klassen genom att tillsätta maxFiles alternativet i file valideringsregeln att begränsa det maximala antalet filer får ladda upp. Att ställa maxFiles till 0 betyder att det inte finns någon gräns för antalet filer som kan laddas upp samtidigt. Det maximala antalet filer som kan laddas upp samtidigt är också begränsat med PHP-direktivet max_file_uploads , som är standard till 20. upload() bör också uppdateras för att spara de uppladdade filerna en och en.

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

I visningsfilen ska du lägga till multiple alternativ i fileInput() så att fileInput() kan ta emot flera filer:

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

Och slutligen i kontrolleråtgärden, bör du ringa UploadedFile::getInstances() istället för UploadedFile::getInstance() att tilldela en matris av UploadedFile instanser till 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow