Subiendo archivos con KumbiaPHP Parte 1 – 3

Controlador Kumbia PHP Vistas y helpers

Como dice el titulo esta es la primera entrega de como subir archivos con kumbiaPHP, para esta primera entrega utilizare la herramientas propias de kumbiaPHP posteriormente utilizaremos algunas librerías de terceros.

Estoy trabajando para que puedan ver los ejemplos de los tutoriales corriendo en vivo y lo puedan comprobar por sus propios ojos 🙂 los resultados. pero por lo mientras espero que disfruten este post.

A subir imágenes

Nuestra vista imagenes.phtml

echo "Subir Imágenes";
 //upload/imagenes
 //uload: nuestro controlador
 //imagenes; nuestra accion
 echo Form::openMultipart('upload/imagenes') ;
    echo "Ingrese una imagen .jpg , .gif ó .png :";
     echo Form::file('imagen') ;
     echo Form::hidden('oculto'); //para saber si se envió el form
     echo Form::submit('subir') ;
 echo Form::close() ;

image

Nuestro controlador uploadController

public function imagenes() {
	View::template("default");
	 if (!empty($_FILES)) {  //para saber si se envió el form
	     //llamamos a la libreria y le pasamos el nombre del campo file del formulario
	    $archivo = Upload::factory('imagen');

	    $archivo->setMinSize("262144");//Tamaño minimo del archivo 250 bytes aprox
	    $archivo->setMaxSize("1048576");//Tamaño maximo del archivo 1 MB
		/*
		Establememos la ruta donde se guardara el archivos
		Si no se establece:
		$archivo->setPath("files/upload/imagenes");
		Por default almacena el archivo en: files/upload/
		*/
	    $archivo->setPath("files/upload/imagenes");

	   //le asignamos las extensiones a permitir
	   $archivo->setExtensions(array('jpg','png','gif')); 

		if ($archivo->isUploaded()) {
		        if ($archivo->save()) {
				Flash::success("Imagen subida correctamente");
			}
		}else{
	              Flash::error('No se ha Podido Subir el Archivo...!!!');
		}
	}
}

image

Más funciones para archivos de tipo imagen

/*Asigna el ancho mínimo de la imagen*/
$archivo->setMinWidth($value);

/*Asigna el ancho máximo de la imagen*/
$archivo->setMaxWidth($value);

/*Asigna el alto mínimo de la imagen*/
$archivo->setMinHeight($value);

/*Asigna el alto máximo de la imagen */
$archivo->setMaxHeight($value);
Loading spinner

5 comentarios en «Subiendo archivos con KumbiaPHP Parte 1 – 3»

  1. Dentro del “if ($archivo->isUploaded()) ”
    Puedes colocar tu codigo para almacenar en tu BD.

    puedes obtener el nombre de tu archivo con extencion es:
    $nombreArchivo = basename($_FILES[“Filedata”][‘name’]);

    Para conocer la extención la puedes obtener con:
    $ext = substr(strrchr($nombreArchivo, ‘.’), 1);

    Teniendo el nombre de tus archivos, ya puedes almacenarlos en tu BD.

    Loading spinner

  2. A que se debe el error: Warning: getimagesize(): Filename cannot be empty in C:\xampp\htdocs\kumbiaphpcopy\core\libs\upload\adapters\image_upload.php on line 69

    Loading spinner

  3. Cuando hablamos de KUMBIA_VERSION = ‘1.1.5’;
    Tanto en el adapter image_upload.php como en el lib upload.php se intenta acceder a los datos del arreglo global $_FILE sin considerar que cada valor es a su vez un arreglo.
    Ejemplo, en mi caso, haciendo uso de var_dump() pude verificar que la estructura enviada por el POST era
    array(1) {
    [“issues”]=> array(5) {
    [“name”]=> array(1) { [“proof”]=> string(9) “login.jpg” }
    [“type”]=> array(1) { [“proof”]=> string(10) “image/jpeg” }
    [“tmp_name”]=> array(1) { [“proof”]=> string(38) “C:\Program Files\Ampps\tmp\php72CA.tmp” }
    [“error”]=> array(1) { [“proof”]=> int(0) }
    [“size”]=> array(1) { [“proof”]=> int(40098) } }
    }
    De allí que, si le pasamos el nombre del campo file del formulario (en el ejemplo, “proof”) obtendremos un error como el señalado ya que el adapter intentará obtener el valor de $_FILE[“proof”][“tmp_name”] el cual no existe. Si en lugar de ello, intentásemos pasar el valor como modelo.campo tampoco podremos acceder al valor ya que el adapter buscará $_FILE[“issues.proof”][“tmp_name”]. En todo caso, pasar el valor del modelo nos permite omitir ese error ya que el adapter si encuentra $_FILE[“issues”][“tmp_name”]; pero, inevitablemente caeremos en otros errores en el procesamiento ya que el lib no está preparado para procesar un array.
    Realizar los ajustes en el lib o en el adapter puede ser algo pesado, y podría incluso inyectar comportamiento indeseados para otras situaciones, de manera que, personalmente opte por implementar una solución poco menos ortodoxa, implementando una clase utilitaria que extrae los valores del arreglo para de esa manera corregir el comportamiento anómalo del image_upload.php. Básicamente, leo el valor contenido en cada arreglo y lo vuelvo a settear fuera de este; algo como:
    $_FILE[“issues”][“tmp_name”] = $_FILE[“issues”][“tmp_name”][“proof”];

    Por si a alguien le resulta de utilidad, les dejo la implementación de la utileria.
    [file_util.php]

    [end file_util.php]

    Ya con ello, solo se debe realizar la llamada justo antes de llamar al factory enviándole como parámetro el valor “modelo.campo”
    $modelo = FileUtil::fixFILE($imageField);
    El valor retornado es lo que debemos pasar al factory.

    Loading spinner

  4. [file_util.php]
    /**
    * Utilidad para $_FILE
    */
    class FileUtil
    {
    /**
    * Extrae los valores del arreglo para corregir comportamiento del image_upload.php
    *
    * @imageField string modelo.campo
    * @return string|false
    */
    public static function fixFILE($imageField)
    {
    if (!empty($_FILES)) {

    echo var_dump($_FILES);

    $arr = explode(‘.’, trim($imageField, ‘.’));
    $modelo = $arr[0];
    $campo = $arr[1];

    $_FILES[$modelo][“name”] = $_FILES[$modelo][“name”][$campo];
    $_FILES[$modelo][“type”] = $_FILES[$modelo][“type”][$campo];
    $_FILES[$modelo][“tmp_name”] = $_FILES[$modelo][“tmp_name”][$campo];
    $_FILES[$modelo][“error”] = $_FILES[$modelo][“error”][$campo];
    $_FILES[$modelo][“size”] = $_FILES[$modelo][“size”][$campo];

    return $modelo;
    }
    return false;
    }
    }
    [end file_util.php]

    Loading spinner

Deja una respuesta

Tu dirección de correo electrónico no será publicada.