lunes, 23 de febrero de 2015

Yii Framework 2 - UploadedFile (Subida de archivos)




En este capítulo veremos como realizar una subida múltiple de archivos, para ello crearemos un formulario activo (ActiveForm) que contendrá un input file multiple, este formulario estará conectado a un modelo de validación, desde el cual estableceremos los siguientes parámetros ...

 - La subida de algún archivo es requerida
 - El archivo no podrá tener un tamaño mayor de 1 MB
 - El archivo no podrá tener un tamaño menor de 10 Bytes
 - El archivo deberá tener una de las siguientes extensiones pdf, doc y txt
 - El máximo de archivos que se pueden subir son 4.

Para la validación del campo input file utilizaremos la siguiente documentación ...

yii\validators\FileValidator: www.yiiframework.com/doc-2.0/yii-validators-filevalidator.html

Para la subida de archivos utilizaremos la clase ...

yii\web\UploadedFile: www.yiiframework.com/doc-2.0/yii-web-uploadedfile.html

1 - Activar en el archivo php.ini la extensión php_fileinfo.dll

2 - Crear la vista upload.php donde se encuentra el formulario con el campo input file ...

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>

<?= $msg ?>

<h3>Subir archivos</h3>

<?php $form = ActiveForm::begin([
     "method" => "post",
     "enableClientValidation" => true,
     "options" => ["enctype" => "multipart/form-data"],
     ]);
?>

<?= $form->field($model, "file[]")->fileInput(['multiple' => true]) ?>

<?= Html::submitButton("Subir", ["class" => "btn btn-primary"]) ?>

<?php $form->end() ?>


3 - Crear el modelo de validación FormUpload.php

<?php
 
namespace app\models;
use yii\base\model;
 
class FormUpload extends model{
  
    public $file;
     
    public function rules()
    {
        return [
            ['file', 'file', 
   'skipOnEmpty' => false,
   'uploadRequired' => 'No has seleccionado ningún archivo', //Error
   'maxSize' => 1024*1024*1, //1 MB
   'tooBig' => 'El tamaño máximo permitido es 1MB', //Error
   'minSize' => 10, //10 Bytes
   'tooSmall' => 'El tamaño mínimo permitido son 10 BYTES', //Error
   'extensions' => 'pdf, txt, doc',
   'wrongExtension' => 'El archivo {file} no contiene una extensión permitida {extensions}', //Error
   'maxFiles' => 4,
   'tooMany' => 'El máximo de archivos permitidos son {limit}', //Error
   ],
        ]; 
    } 
 
 public function attributeLabels()
 {
  return [
   'file' => 'Seleccionar archivos:',
  ];
 }
}



4 - Agregar las clases FormUpload y UploadedFile al controlador ...

use app\models\FormUpload;
use yii\web\UploadedFile;


5 - Crear la acción Upload en el controlador

 public function actionUpload()
 {
  
  $model = new FormUpload;
  $msg = null;
  
  if ($model->load(Yii::$app->request->post()))
  {
   $model->file = UploadedFile::getInstances($model, 'file');

   if ($model->file && $model->validate()) {
    foreach ($model->file as $file) {
     $file->saveAs('archivos/' . $file->baseName . '.' . $file->extension);
     $msg = "<p><strong class='label label-info'>Enhorabuena, subida realizada con éxito</strong></p>";
    }
   }
  }
  return $this->render("upload", ["model" => $model, "msg" => $msg]);
 }


6 - Crear la carpeta archivos en la carpeta web, en esta carpeta se guardarán los archivos subidos por el usuario ...


Ver el vídeo tutorial de Yii Framework 2 en Youtube