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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow