Buscar..


Cómo hacerlo

Cargando archivos

La carga de archivos en Yii se realiza generalmente con la ayuda de [[yii \ web \ UploadedFile]], que encapsula cada archivo cargado como un objeto UploadedFile . Combinado con [[yii \ widgets \ ActiveForm]] y modelos, puede implementar fácilmente un mecanismo seguro de carga de archivos.

Creando Modelos

Al igual que trabajar con entradas de texto sin formato, para cargar un solo archivo, crearía una clase de modelo y usaría un atributo del modelo para mantener la instancia del archivo cargado. También debe declarar una regla de validación para validar la carga del archivo. Por ejemplo,

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

En el código anterior, el atributo imageFile se usa para mantener la instancia del archivo cargado. Se asocia con una regla de validación de file que utiliza [[yii \ validators \ FileValidator]] para garantizar que se cargue un archivo con el nombre de extensión png o jpg . El método upload() realizará la validación y guardará el archivo cargado en el servidor.

El validador de file permite verificar las extensiones de archivo, el tamaño, el tipo MIME, etc. Consulte la sección Validadores básicos para obtener más detalles.

Sugerencia: si está cargando una imagen, puede considerar usar el validador de image . El validador de image se implementa a través de [[yii \ validators \ ImageValidator]] que verifica si un atributo ha recibido una imagen válida que se puede guardar o procesar con la Extensión de Imagine .

Archivo de entrada de render

A continuación, cree una entrada de archivo en 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() ?>

Es importante recordar que agrega la opción enctype al formulario para que el archivo se pueda cargar correctamente. La llamada fileInput() mostrará una etiqueta <input type="file"> que permitirá a los usuarios seleccionar un archivo para cargar.

Consejo: desde la versión 2.0.8, [[yii \ web \ widgets \ ActiveField :: fileInput | fileInput]] agrega la opción enctype al formulario automáticamente cuando se usa el campo de entrada del archivo.

Cableado

Ahora, en una acción del controlador, escriba el código para conectar el modelo y la vista para implementar la carga de archivos:

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

En el código anterior, cuando se envía el formulario, se llama al método [[yii \ web \ UploadedFile :: getInstance ()]] para representar el archivo cargado como una instancia de UploadedFile . Luego confiamos en la validación del modelo para asegurarnos de que el archivo cargado sea válido y guarde el archivo en el servidor.

Subiendo múltiples archivos

También puede cargar varios archivos a la vez, con algunos ajustes al código enumerados en las subsecciones anteriores.

Primero debe ajustar la clase del modelo agregando la opción maxFiles en la regla de validación de file para limitar el número máximo de archivos que se pueden cargar. Establecer maxFiles en 0 significa que no hay límite en la cantidad de archivos que se pueden cargar simultáneamente. El número máximo de archivos que se pueden cargar simultáneamente también está limitado con la directiva de PHP max_file_uploads , cuyo valor predeterminado es 20. El método upload() también debe actualizarse para guardar los archivos cargados uno por 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;
        }
    }
}

En el archivo de vista, debe agregar la opción multiple a la llamada fileInput() para que el campo de carga de archivos pueda recibir varios archivos:

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

Y finalmente, en la acción del controlador, debe llamar a UploadedFile::getInstances() lugar de UploadedFile::getInstance() para asignar una matriz de instancias de 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow