subir ficheros con swfupload componente cakephp

subir ficheros con swfupload componente cakephp

Existe una herramienta genial para subir ficheros a un servidor con PHP, Javascript y un flash, se llama SwfUpload y muchos ya la conocerán, pero integrarla en CakePHP ha sido un poco caos porque los artículos que hay están desactualizados, hechos para versiones obsoletas de SwfUpload o para la versión 1.1 de CakePHP, por lo que he tenido que tocar mucho.

En el siguiente artículo de CakePHP lo explican mas o menos http://bakery.cakephp.org/articles/view/swfupload-and-multipurpose-uploader y en la documentación oficial de SwfUpload te envían al artículo, asi que tampoco es que sea una maravilla.

Yo voy a explicar lo que he hecho para integrar el SwfUpload en CakePHP con las versiones mas actuales ahora mismo:
CakePHP: 1.2 y SwfUpload 2.2.0.1

Lo primero el Componente. Que es lo único que he copiado íntegro del artículo.
y guardarlo en app/controllers/components/swf_upload.php

<?php
/* $Id$ */
/**
 * SwfUploadComponent - A CakePHP Component to use with SWFUpload
 * Copyright (C) 2006-2007 James Revillini <james at revillini dot com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/**
 * SwfUploadComponent - A CakePHP Component to use with SWFUpload
 * Thanks to Eelco Wiersma for the original explanation on handling
 * uploads from SWFUpload in CakePHP. Also, thanks to gwoo for guidance
 * and help refactoring for performance optimization and readability.
 * @author James Revillini http://james.revillini.com
 * @version 0.1.4
 */

/**
 * @package SwfUploadComponent
 * @subpackage controllers.components
 */
class SwfUploadComponent extends Object {

	/* component configuration */
	var $name = 'SwfUploadComponent';
	var $params = array();
	var $errorCode = null;
	var $errorMessage = null;

	// file and path configuration
	var $uploadpath;
	var $webpath = '/files/';
	var $overwrite = false;
	var $filename;

	/**
	 * Contructor function
	 * @param Object &$controller pointer to calling controller
	 */
	function startup(&$controller) {
		// initialize members
		$this->uploadpath = 'files' . DS;

		//keep tabs on mr. controller's params
		$this->params = $controller->params;

	}

	/**
	 * Uploads a file to location
	 * @return boolean true if upload was successful, false otherwise.
	 */
	function upload() {
		$ok = false;
		if ($this->validate()) {
			$this->filename = $this->params['form']['Filedata']['name'];
			$ok = $this->write();
		}

		if (!$ok) {
			header("HTTP/1.0 500 Internal Server Error");	//this should tell SWFUpload what's up
			$this->setError();	//this should tell standard form what's up
		}

		return ($ok);
	}

	/**
	 * finds a unique name for the file for the current directory
	 * @param array an array of filenames which exist in the desired upload directory
	 * @return string a unique filename for the file
	 */
	function findUniqueFilename($existing_files = null) {
		// append a digit to the end of the name
		$filenumber = 0;
		$filesuffix = '';
		$fileparts = explode('.', $this->filename);
		$fileext = '.' . array_pop($fileparts);
		$filebase = implode('.', $fileparts);

		if (is_array($existing_files)) {
			do {
				$newfile = $filebase . $filesuffix . $fileext;
				$filenumber++;
				$filesuffix = '(' . $filenumber . ')';
			} while (in_array($newfile, $existing_files));
		}

		return $newfile;
	}

	/**
	 * moves the file to the desired location from the temp directory
	 * @return boolean true if the file was successfully moved from the temporary directory to the desired destination on the filesystem
	 */
	function write() {
		// Include libraries
		if (!class_exists('Folder')) {
			uses ('folder');
		}

		$moved = false;
		$folder = new Folder($this->uploadpath, true, 0755);

		if (!$folder) {
			$this->setError(1500, 'File system save failed.', 'Could not create requested directory: ' . $this->uploadpath);
		} else {
			if (!$this->overwrite) {
				$contents = $folder->ls();  //get directory contents
				$this->filename = $this->findUniqueFilename($contents[1]);  //pass the file list as an array
			}
			if (!($moved = move_uploaded_file($this->params['form']['Filedata']['tmp_name'], $this->uploadpath . $this->filename))) {
				$this->setError(1000, 'File system save failed.');
			}
		}
		return $moved;
	}

	/**
	 * validates the post data and checks receipt of the upload
	 * @return boolean true if post data is valid and file has been properly uploaded, false if not
	 */
	function validate() {
		$post_ok = isset($this->params['form']['Filedata']);
		$upload_error = $this->params['form']['Filedata']['error'];
		$got_data = (is_uploaded_file($this->params['form']['Filedata']['tmp_name']));

		if (!$post_ok){
			$this->setError(2000, 'Validation failed.', 'Expected file upload field to be named "Filedata."');
		}
		if ($upload_error){
			$this->setError(2500, 'Validation failed.', $this->getUploadErrorMessage($upload_error));
		}
		return !$upload_error && $post_ok && $got_data;
	}

	/**
	 * parses file upload error code into human-readable phrase.
	 * @param int $err PHP file upload error constant.
	 * @return string human-readable phrase to explain issue.
	 */
	function getUploadErrorMessage($err) {
		$msg = null;
		switch ($err) {
			case UPLOAD_ERR_OK:
				break;
			case UPLOAD_ERR_INI_SIZE:
				$msg = ('The uploaded file exceeds the upload_max_filesize directive ('.ini_get('upload_max_filesize').') in php.ini.');
				break;
			case UPLOAD_ERR_FORM_SIZE:
				$msg = ('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.');
				break;
			case UPLOAD_ERR_PARTIAL:
				$msg = ('The uploaded file was only partially uploaded.');
				break;
			case UPLOAD_ERR_NO_FILE:
				$msg = ('No file was uploaded.');
				break;
			case UPLOAD_ERR_NO_TMP_DIR:
				$msg = ('The remote server has no temporary folder for file uploads.');
				break;
			case UPLOAD_ERR_CANT_WRITE:
				$msg = ('Failed to write file to disk.');
				break;
			default:
				$msg = ('Unknown File Error. Check php.ini settings.');
		}

		return $msg;
	}

	/**
	 * sets an error code which can be referenced if failure is detected by controller.
	 * note: the amount of info stored in message depends on debug level.
	 * @param int $code a unique error number for the message and debug info
	 * @param string $message a simple message that you would show the user
	 * @param string $debug any specific debug info to include when debug mode > 1
	 * @return bool true unless an error occurs
	 */
	function setError($code = 1, $message = 'An unknown error occured.', $debug = '') {
		$this->errorCode = $code;
		$this->errorMessage = $message;
		if (DEBUG) {
			$this->errorMessage .= $debug;
		}
		return true;
	}
}
?>

He creado un controller para procesar todos las imágenes subidas.
app/controllers/archivos_controller.php

<?php
class ArchivosController extends AppController
{

    var $components = array('SwfUpload');

    function __construct()
    {
        parent::__construct();
        $this->layout = 'ajax';
        $this->autoRender = false;
        Configure::write('debug',0);
    }

    function subir()
    {
        # Controlo donde subirlo y cambio los path
        if (isset($this->params['pass']['0']))
        {
            switch($this->params['pass']['0'])
            {
                case 'video':
                    $this->SwfUpload->uploadpath = APP . WEBROOT_DIR . DS . 'files' . DS . 'videos';
                    $this->SwfUpload->webpath = '/upload_videos/' ;
                break;
                case 'cms':
                    $this->SwfUpload->uploadpath = APP . WEBROOT_DIR . DS . 'files' . DS . 'cms';
                    $this->SwfUpload->webpath = '//' ;
                break;
                # etc.. lo que querais
            }
        }

        # funciones para subir los ficheros.
        if (isset($this->params['form']['Filedata']))
        {
            if ($this->SwfUpload->upload())
            {
                $this->params['form']['Filedata']['name'] = $this->SwfUpload->filename;
                $this->params['form']['Filedata']['path'] = $this->SwfUpload->webpath;
                $this->params['form']['Filedata']['fspath'] = $this->SwfUpload->uploadpath . $this->SwfUpload->filename;
                $this->data['Archivo'] = $this->params['form']['Filedata'];

                # guardamos el resultado en BBDD
                if (!($file = $this->Archivo->save($this->data)))
                {
                    $this->Session->setFlash('Guardado con éxito');
                }
                else
                {
                    $this->Session->setFlash('Archivo subido: ' . $this->SwfUpload->filename . '; Id en base de datos: ' . $this->Archivo->getLastInsertId() . '.');
                    echo $this->Archivo->getLastInsertId();
                    exit;
                }
            }
            else
            {
                $this->Session->setFlash($this->SwfUpload->errorMessage);
            }
        }
    }

    /**
    * carga un archivo conociendo su id
    *
    * @param mixed $id
    */
    function abrir($id)
    {
        $file = $this->get($id);
        if (isset($file)) {
            $this->redirect($file['Archivo']['path'] . $file['Archivo']['name']);
            exit();
        }
    }

    function get($id)
    {
        # sacamos la informacion del fichero
        $file = $this->Archivo->findById($id);
        return $file;
    }
}
?>

Creamos el Modelo y a continuación incluyo la SQL para crear la tabla

<?php
class Archivo extends AppModel
{

    var $name = 'archivo';

}
?>

SQL para crear la tabla

CREATE TABLE `archivos` (
                 `id` int(11) NOT NULL auto_increment,
                 `created` datetime NOT NULL default '0000-00-00 00:00:00',
                 `updated` datetime NOT NULL default '0000-00-00 00:00:00',
                 `path` varchar(255) NOT NULL default '',
                 `name` varchar(255) NOT NULL default '',
                 `fspath` varchar(255) default NULL,
                 `type` varchar(255) NOT NULL default '',
                 `size` int(11) NOT NULL default '0',
                 `deleted` tinyint(4) NOT NULL default '0',
                 PRIMARY KEY  (`id`),
                 UNIQUE KEY `path_name_idx` (`path`,`name`)
               ) ENGINE=InnoDB CHARSET=utf8

Bueno pues hasta aquí la cosa ya está casi al 60% para terminar de integrar SwfUpload con CakePHP ahora sólo tenemos que descargarnos las librerías javascript, flash y css.
Esto lo podeis hacer desde aquí: http://code.google.com/p/swfupload/downloads/list

Antes de hacer todo esto os aconsejaría que probarais a hacerlo con PHP simple y vierais como funciona, así tendríais una mejor visión.
Yo me descargué la version SWFUpload v2.2.0.1 Core.zip y SWFUpload v2.2.0.1 Samples.zip, son prácticamente iguales.

Mi arbol de archivos quedó de la siguiente manera
* webroot/js/swfupload/
* webroot/js/swfupload/images/
* webroot/js/swfupload/images/XPButtonUploadText_61x22.png
* webroot/js/swfupload/fileprogress.js
* webroot/js/swfupload/handlers.js
* webroot/js/swfupload/swfupload.js
* webroot/js/swfupload/swfupload.queue.js
* webroot/js/swfupload/swfupload.swf
* webroot/js/swfupload/swfuploadbutton.swf

* webroot/css/swfupload/default.css

Éstas librerías las cargo de la siguiente manera en la vista.

app/views/posts/subir_imagenes.ctp (o cualquier vista desde la que queráis subir imágenes)

<?
    # incluyo el css de swfupload
    echo $html->css('swfupload/default'). " n";
    # incluyo las librerias de javascript para el swfupload
    echo $javascript->link('swfupload/swfupload', NULL, false);
    echo $javascript->link('swfupload/swfupload.queue', NULL, false);
    echo $javascript->link('swfupload/fileprogress', NULL, false);
    echo $javascript->link('swfupload/handlers', NULL, false);

    # a continuación añado la llamada javascript que inicia y carga el formulario de SWFupload
?>

<script type="text/javascript">
                    var swfu;

                    window.onload = function() {
                        var settings = {
                            flash_url : "/js/swfupload/swfupload.swf",
                            upload_url: "/archivos/subir/cms",
                            post_params: {"PHPSESSID" : "<?php echo session_id(); ?>"},
                            file_size_limit : "100 MB",
                            file_types : "*.*",
                            file_types_description : "All Files",
                            file_upload_limit : 100,
                            file_queue_limit : 0,
                            custom_settings : {
                                progressTarget : "fsUploadProgress",
                                cancelButtonId : "btnCancel"
                            },
                            debug: false,

                            // Configuración del botón de "upload"
                            button_image_url: "/js/swfupload/images/XPButtonUploadText_61x22.png",
                            button_width: "61",
                            button_height: "22",
                            button_placeholder_id: "spanButtonPlaceHolder",
                            button_text: '',
                            button_text_style: ".theFont { font-size: 16; }",
                            button_text_left_padding: 12,
                            button_text_top_padding: 3,

                            file_queued_handler : fileQueued,
                            file_queue_error_handler : fileQueueError,
                            file_dialog_complete_handler : fileDialogComplete,
                            upload_start_handler : uploadStart,
                            upload_progress_handler : uploadProgress,
                            upload_error_handler : uploadError,
                            upload_success_handler : uploadSuccess,
                            upload_complete_handler : uploadComplete,
                            queue_complete_handler : queueComplete
                        };

                        swfu = new SWFUpload(settings);
                     };
                </script>

               <form>
                    <!-- div contenedores del formulario de SwfUpload y donde se mostrará el proceso de carga -->
                    <div class="fieldset flash" id="fsUploadProgress">
                        <span class="legend">Subir Ficheros</span>
                    </div>
                    <div id="divStatus">Pulsa en upload para seleccionar las imágenes.<br />Puede subir un máximo de tres imagenes por producto, de 2MB de máximo cada uno. Solo admite JPG y GIF y es aconsejable que en su titulos no haya caracteres extraños tales como `, *, o ñ. Debe esperar unos segundos hasta que se completa la transferencia.</div>
                    <div>
                    <span id="spanButtonPlaceHolder"></span>
                        <!-- stilos del boton cancelear margin-left: 2px; font-size: 8pt; height: 29px;-->
                        <input id="btnCancel" type="button" value="Cancelar" onclick="swfu.cancelQueue();" disabled="disabled" style="" />
                    </div>
                    </form>

En el script anterior que inicia el formulario de swfupload hay variables de configuracion que a mi me han servido, se pueden cambiar y poner las que queráis, echar un ojo a la versión SWFUpload v2.2.0.1 Samples.zip para ver los diferentes tipos de botones que hay, etc..

El formulario lo tendreis que crear como normalmente lo hagáis ya sea con el helper Form de CakePHP o con HTML normal, yo lo he puesto algo de ejemplo.

Cualquier duda escribir un comentario…

Espero que os ayude!

ACTUALIZACIÓN:

Adjunto un zip con toda la estructura del ejemplo:
[download id=”1″ format=”4″ autop=”false”]

Tags de búsquedas:

swfupload cakephp,cakephp 1 3 ficheros,cakephp subir archivos,queue_complete_handler paso de parametros,subir multiples archivos cakephp,subir un archivo en cakephp,tengo mi menu como botones cakephp 2 x,usar SwfUpload cakephp 2 0,usllamar la vista d eun plugin a otra vista cakephp

Noticias relacionadas »

42 comentarios en subir ficheros con swfupload componente cakephp

  1. / Responder

    The delivery mechanism for the reconstituted weapon of mass devastation is a man named Alec. Recently returned from brutal captivity in Texas, Alec was Miles’ protege until he bungled an assassination mission on Texas’ leader (and could be ID’d). In a flashback, a colder Miles unflinchingly turns what amounts to his son over to Texas, knowing that he’ll be brutalized. In the words of Montgomery Scott “better to kill him know and get it over with”. Alec survived and escaped nursing a killer grudge; something so severe that he’d kill thousands of people to sate it.

  2. / Responder

    We were treated to this unique honestly great distribute immediately!

  3. / Responder

    pharmacy reviews http://www.fda-approved-pharmacy.com/products/prednisone.htm denver 24 hour pharmacy

  4. Jose Luis
    / Responder

    Hola Pedro, ayer me encontré un problema con IE6 IE7 y IE8 y es que en estos navegadores, el script que se coloca en las vistas donde quieres subir archivos no me aparece el boton de upload y creo que es pq con estos navegadores el evento window.onload no funciona muy bien.
    Al renderizar la vista, el script no se esta llamando en el evento window.onload=function(){…….}

    ¿Qué podría hacer?

    • Pedro
      / Responder

      pues no me he enfrentado a ese problema todavia, y tampoco lo haré, maldito IE :@ jeje

      échale un ojo a otros foros a ver que te cuentan: http://www.google.es/search?hl=es&rlz=1B3MOZA_esES382ES382&q=+site:swfupload.org+swfupload+javascript+error+on+ie

      en cuanto me entere de algo creo otra respuesta.

      un saludo!

      • Jose Luis
        / Responder

        Como siempre Firefox funciona perfecto, pero ya sabemos lo que hay con IE. Lo que segfuro pasa es que el script no se llama pq no me sale ni un alert q le meto para depurar a ver si se esta llamando.

    • Pablo
      / Responder

      Hola , muy buen tutorial, estoy trabajando con Cakephp 2.0 y el ejemplo no me funciona , me dice que el update esta completo pero no sube el archivo. Sabes que cambios hacer para 2.0 ? Muchas
      gracias!!

      • Pedro Ventura
        / Responder

        Gracias Pablo!

        Pues la verdad que no se que cambios habrá que hacer para la versión 2.0. Ahora mismo estoy en un nuevo proyecto y me estoy actualizando a esta nueva versión ya que siempre he usado la 1.2. Si consigo replicar los cambios en la nueva versión te avisaré.

        Si tu los sacas antes comentalo, vale??!!! 😉

        Un saludo!

  5. Jose Luis
    / Responder

    Buenos días Pedro. Comentarte que ya he hecho correr la aplicación en cake 1.3.
    He averiguado un par de cosas:

    1) Como bien tu dijiste las barras hay que cambiarlas por DS en archvios_controller, en el metodo subir.

    2) Ojo con la ruta que devuelve el metodo:

    SWFUpload.completeURL = function(url) {
    if (typeof(url) !== “string” || url.match(/^https?:///i) || url.match(/^//)) {
    return url;
    }

    var currentURL = window.location.protocol + “//” + window.location.hostname + (window.location.port ? “:” + window.location.port : “”);

    var indexSlash = window.location.pathname.lastIndexOf(“/”);
    if (indexSlash http://localhost/proyecto/fotos/add, la ruta que devuelve el metodo anterior es erronea debido a que window.location.pathname.substr(0, indexSlash) + “/”; devuelve http://localhost/proyecto/fotos y claro al concatenar eso con la url del boton por nos queda http//localhost/proyecto/fotos/js/swfupload/images/button.png cuando deberia ser http//localhost/proyecto/js/swfupload/images/button.png y por este motivo a mucha gente puede no estar aparenciendole el boton cuando cargan su vista desde un metodo distinto a index.

    3) Otra cosa por la que no me subia los archivos es que hay q cambiar en el metodo SwfUpload->write() del componente SwfUpload la sentencia $contents = $folder->ls(); por $contents = $folder->read(); dado que en cake 1.3 el metodo ls() de folder esta obsoleto.

    Haciendo todos estos cambios, he conseguido utilizar el SwfUpload en cake 1.3 sin problema.

    Saludos

    • / Responder

      Me alegro mucho!! a veces hay codigos que se atraviesan y no salen,eh! me alegro que lo hayas sacado!! y gracias por compartir tus mejoras!!

      Un saludo!!

    • / Responder

      Asi es Jose Luis, he seguido las instrucciones que dejaste, y ha andado en cake 1.3, principalmente la sentencia “$contents = $folder->read();” en el componente es determinante,felicitaciones Pedro y a todos los aportantes

  6. Jose Luis
    / Responder

    Hola Pedro. Primero felicitarte por invertir tu tiempo en ayudar a los demás. Estoy realizando una aplicación web donde necesito justamente el sistema de subida múltiple de archivos. He seguido este tutorial y tengo un problema que no logro solucionar.

    En una vista determinada coloco el script q me carga el fomulario de subida múltiple de archivos. Los botones me aparecen pero cuando hago un upload de un archivo me sale: Upload error : 500.

    El directorio images se me crea en el webroot pero no hay ninguna foto y en la tabla archivos de la base de datos no hay ningun registro. Se ve que al subir la imagen hay algún error pero ni idea de cual puede ser el error 500.
    Por permisos no creo que sea dado que si me crea el directorio, supongo que podrá escribir archivos dentro de él, además estoy trabajando en windows no en linux.
    ¿Tú que opinas?

    • Pedro
      / Responder

      Buenas, pues puede ser que no te está encontrando el controlador que guarda las imágenes y genera el registro en la tabla. El error 500 es porque no encuentra o no existe la url solicitada, por lo que intuyo puede vernir de esto.

      Fíjate que en en la vista (la última parte de código de este post), en el javascript hay una variable upload_url: “/archivos/subir/cms”, ese es la url a la que se llama, fíjate que tu la tengas bien, es decir que exista el controller archivos y su función subir.
      No se si en windows tendrás que poner las barras al revés tipo: upload_url: “archivossubircms”
      Probaste a descargarte el código que tengo?

    • Jose Luis
      / Responder

      El controller está bien, de hecho si fuera problema de rutas no me cargaría ni el boton upload del formulario múltiple.

      Mi proyecto está en una carpeta llamada http.//localhost/ventanilla
      te voy a poner las url que me quedan:

      UploadUrl->http://localhost/ventanilla/archivos/subir/images

      Url del flash->http://localhost/ventanilla/js/swfupload.swf?preventswfcatching=235458454454

      Url imagen boton flash->http://localhost/ventanilla/js/swfupload/images/wdp_buttons_upload_114x29.png.

      Las rutas están bien pq me aprecen los botones. Yo estoy utilizando cake 1.3 no 1.2. En 1.2 va bien pero estoy intentando averiguar pq en 1.3 me da ese error.

      Estoy sospechando que viene a petar en el metodo SwfUpload->upload() del componente SwfUpload, dentro de este metodo hay una sentencia que es this->validate() la cual supongo que será para validar un archivo enviado y sino pasa la validacion mete en el header un error 500, justo el que me da.

      function upload() {
      $ok = false;
      if ($this->validate()) {
      $this->filename = $this->params[‘form’][‘Filedata’][‘name’];
      $ok = $this->write();
      }

      if (!$ok) {
      header(“HTTP/1.0 500 Internal Server Error”); //this should tell SWFUpload what’s up
      $this->setError(); //this should tell standard form what’s up
      }

      return ($ok);
      }

      Lo que no entindo es pq en cake 1.2 no peta y en cake 1.3 si.

      Al controlador archivos se llama bien pq me crea la carpeta images dentro del webroot.

      Creo que cuando un archvio se sube se escribe primero a un directorio temporal y luego se mueve al images del webroot. ¿Podría ser que el directorio temporal no tenga permisos o algo así?

      • Pedro
        / Responder

        Bueno no te equivoques porque aparezca el boton, eh?!
        Cuando llamas al boton, se llama a otra url distinta que la del controller

        button_image_url: “/js/swfupload/images/XPButtonUploadText_61x22.png”,

        Mientras que el path de upload es: upload_url: “/archivos/subir/cms”,

        El error que esta generando mas que en la funcion upload() yo creo que te lo esta dando en write(), ya que $ok, tiene que valor que le ha devuelto ésta funcion, fíjate en el código

        $ok = false;
        if ($this->validate()) {
        $this->filename = $this->params[‘form’][‘Filedata’][‘name’];
        $ok = $this->write();
        }

        if (!$ok) {
        header(“HTTP/1.0 500 Internal Server Error”); //this should tell SWFUpload what’s up
        $this->setError(); //this should tell standard form what’s up
        }

        ÉSto o lo que tu comentas que no esta validando, con validate()
        prueba a hacer un print_r($this->params[‘form’]) para ver si te estan llegando bien todos los datos… sino vete debugeando cada linea del componente a ver donde se esta quedando.
        También puedes probar a hacer un debug directamente de las funciones de javascript. En js/swfupload/handlers.js vete a la
        function uploadSuccess(file, serverData) {
        y después de la linea progress.toggleCancel(false);
        métele: alert(serverData); para ver que te está devolviendo las funciones de javascript… a ver si le llega todo ok…

        • Jose Luis
          / Responder

          He intentado hacer echo´s en el componente npara ver variables y demas pero no me sale nada por pantalla. Voy a ver variables de los archivos javascripts que me dices pero es raro pq en la 1.2 de cake va perfecto. Te dije que petaba en el SwfUpload->validate() pq para llegar a su metodo write antes triene que validar.

          • Pedro

            vaya! pues échale un ojo a eso que te he dicho antes de meter el alert() en el handlers.js a ver que te dice, pero si esta esta fallando el validate(), prueba a forzarlo para devuelva true y a ver que es lo que sigue haciendo..

          • Jose Luis

            Es curioso pero pongo alerts en la funcion
            function uploadSuccess(file, serverData) del script handlers y no me sale ningun alert. Es como si esta funcion no se estuviera llamando. Te dice algo?

          • Jose Luis

            La que si se llama es function uploadError(file, errorCode, message) que es la q me muestra Upload Error: 500

          • Jose Luis

            En la function uploadError(file, errorCode, message) hice un alert de errorCode y me sale -200 que es HTTPError pero no se a q se debe. Ya te digo que el directorio images en webroot me lo crea lo q no me sube archivos pq me esta dando ese error. Cada vez estoy mas convencido de que tiene q ser por algo del cake 1.3

        • Pedro
          / Responder

          Estas utilizando el archivos_controller.php que tengo hecho yo?

          has probado antes a cambiar los path?

          $this->SwfUpload->uploadpath = APP . WEBROOT_DIR . DS . ‘files’ . DS . ‘videos’;
          $this->SwfUpload->webpath = ‘/upload_videos/’ ;

          haz el print_r($this->params[‘form’]) en este controller y le metes un exit al final.

          Otra cosa que luego hacer para debuger en estos casos tan difíciles es usar la función log de cakephp $this->log(aquí le metes un echo o lo que quieras, y el segundo parametro el nombre del log);Ejmplo: $this->log(‘entra en funcion’,’bug_swfupload’); y luego vas a /app/tmp/logs/bug_swfupload.log y vas viendo lo que guarda.

          • Jose Luis

            Al final pase toda la aplicacion a cake 1.2. Ahora me sube los archivos, me guarda los registro en la tabla archivos. Pero hay un comportamiento q me deja de piedra. Me cargo el archivos_controller.php y me sigue guardando los registros en la base de datos y subiendo los archivos jajajaja. increible

  7. IM
    / Responder

    Pedro, alegrate. 37 personas han descargado tu codigo y nadie tuge ni muge, solo yo (aunque no siquiera han dado las gracias…). Vamos! que eres muy bueno explicando, pero que yo soy el unico que no lo entiende.

    Ayer consegui solucionar los problemillas que tenia, asi que llegue a la vista, pero cual fue mi sorpresa? que no se me veia el boton XPButtonUploadText_61x22.png Pense que ya la habia vuelto a liar, asi que hoy me he puesto desde cero. He cogido tu fichero, y le he hecho un copy/paste en cake y genial. Sin errores. Pero que pasa? Que me sigue pasando igual. Cuando entro en localhost/swfupload/fotos sigue sin aparecerme el boton XPButtonUploadText_61x22.png con lo cual no puedo elegir las imagenes.

    Esta todo en su sitio, en sus rutas. Ha sido coger y pegar tu fichero, sin cambiar nada. Sabes que se debe? Gracias de antemano y siento volver a rayarte.

    Un saludo!

    • / Responder

      Pues eso que no te aparece la imagen es porque seguro la ruta esta mal, o no tienes permismos para ver la imagen o acceder a la carpeta donde tengas la imagen.

      Si es caso 1:
      Descargate un proxy debbuger, yo uso este: http://www.fiddler2.com/fiddler2/version.asp

      Con esto puedes ver todas las peticiones de los elementos, js, css, js, etc que se hacen a una pagina.Con esto puedes ver la ruta a la que esta llamando y las cabecera que te devuelve (200 si todo ok, o 404 sino existe, 500, etc si algo falla)

      O bien, si usas firebug en firebox, en la pestaña red, la activas, y le das a imágenes, así puedes comprobar la ruta, y ver a donde esta consultando esa imagen.

      Si es por permisos y estas trabajando en linux dale 775 a la carpeta de imagenes y a esa imagen… y vamos a ver si asi puedes ir solucionando esto.

      • IM
        / Responder

        Pedro, voy a tener que besar el suelo por donde pisas jaja. He usado el firebug que es el que tenia instalado.

        Desde el navegador accedi hasta la imagen y hasta el .swf y copie las rutas y las pegue en su sitio. Por si acaso se estuviese colando alguna letra o lo que sea. Y funciono! Mirando que hay diferente, he visto esto:

        En el codigo pones ”/js/swfupload/swfupload.swf” y “/js/swfupload/images/XPButtonNoText_61x22.png”. El fallo esta en que sobra la primera / vamos, que seria ”js/swfupload/swfupload.swf”.

        Supongo que el error estaba en que al tener la barra, la ruta seria algo asi: localhost/nombre_proyecto//js/….

        Vale, mientras te escribia estaba probandolo y me daba un error al subir un archivo, un 404, te iba a decir que en el codigo ponia upload_url:”archivos/subir/images” asi que habia creado dentro de webroot esa ruta, pero cai en la cuenta de que volvia a tener el mismo error, sobraba la /. Volvi a probar y funciono! Te juro que hasta me emocione tio! Pero tengo un problema… Voy a la carpeta /webroot/archivos/subir/images/ y esta vacia xDDD. A donde se han ido? xD

        Un saludo tio, y gracias otra vez!!

        • IM
          / Responder

          Olvidalo Pedro. Lo he conseguido, funciona!

          Estaba probando con el primero que hice sin darme cuenta, asi que proble con el que habia empezado desde cero el otro dia. Y tio, funciona!! Juas! Estoy emocionadisimo tio. Se me ha puesto la carne de gallo (de gallina no, que yo soy muy hombre xDD).

          Pedro, gracias tio. Por compartirlo y por tu eterna paciencia y apoyo, de verdad tio. Te daria un abrazo!

          PD: Proximo obejtivo —> convertirlo en un plugin! Tienes alguna idea sobre esto? xD

  8. IM
    / Responder

    Buah, que malo soy explicandome. Perdoname.

    Queria decir, que como aun he de crear la tabla para fotos_controller.php, que si en alguna parte del codigo se hace referencia a alguno de sus campos? Asi podria guiarme para saber que campos ha de tener la tabla.

    Se que al controlador le falta aun la logica, pero es por saber.

    —————-

    Mientras te escribia me hacia la misma pregunta y revisaba el codigo y el API, supongo que puedo econtrar lo que te pregunto en el acrhivos_controller.php en estas lineas:

    $this->params[‘form’][‘Filedata’][‘name’] = $this->SwfUpload->filename;
    $this->params[‘form’][‘Filedata’][‘path’] = $this->SwfUpload->webpath;
    $this->params[‘form’][‘Filedata’][‘fspath’] = $this->SwfUpload->uploadpath . $this->SwfUpload->filename;

    Donde ‘name’, ‘path’ y ‘fspath’ son campos de la tabla archivos. Me equivoco? Si estoy en lo cierto, en caso de que me topase con controller y necesitase crear su tabla, podria hacerlo mirando esos campos.

    Por otro lado, he creado la siguiente tabla fotos:

    E TABLE `fotos` (
    `id` int(11) NOT NULL auto_increment,
    `created` datetime NOT NULL default ‘0000-00-00 00:00:00’,
    `updated` datetime NOT NULL default ‘0000-00-00 00:00:00’,
    `name` varchar(255) NOT NULL default ”,
    `deleted` tinyint(4) NOT NULL default ‘0’,
    ‘archivos_id’ int NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `name_idx` (`name`)
    ) ENGINE=InnoDB CHARSET=utf8

    Y he añadido en el modelo archivo.php: $var hasOner = ‘foto’;

    Mi idea con esto es, que en la vista de fotos si se hace clic en ‘delete’ pues que se borre la foto de ambas tablas. funcionaria? o es una idea sin pies ni cabeza?

    Pregunta aparte… es normal que sueñe con cake? Me estoy volviendo loco xDD

    Un saludo.

    • IM
      / Responder

      Buenas Pedro, me actualizo:

      Una vez hecho lo que comento en el mensaje anterior, y por mucho que le doy vueltas al tema y me pateo todo google, no encuentro explicacion alguna.

      Call to a member function flash() on a non-object in cakelibsviewlayoutsdefault.ctp on line 43

      Me sale ese error. No entiendo porque va a tirar de default.ctp, teniendo la vista creada para fotos. He visto que en la vista de fotos (index.ctp) pone esto:

      /*incluyo el css de swfupload */
      echo $html->css(‘swfupload/default’). ” n”;

      Pero, como dices, es para incluir el css de swfupload, con lo cual no entiendo que hace buscando algo en cakelibs….

      Un saludo.

      • IM
        / Responder

        Vale, este ultimo mensaje no ha tenido ni pies ni cabeza. Ahora entiendo que una cosa es la vista y otra el layout. Y que como no hay layout establecido, tira por el de cake, que es el default.

        Algo voy aprendiendo…

        • Pedro
          / Responder

          jeje es que como tu dijiste… estabas empezando la casa por el tejado… hay que pelear un tiempo con cake para entender la maquinaria y luego ya mediante ensayo-error te va saliendo algo con lo que te quedas atascado..

  9. IM
    / Responder

    Wow!! La actualizacion es nueva, no? El .zip, digo. Es que no la habia vista antes, sea como sea, gracias!

    Siento no haber posteado antes, pero he estado intentando paliar la otra carencia que tenia (pocos conocimientos de PHP). Respecto al API ya me lo habia mirado, pero creo que sera buena idea hacer el blog. Por toquetear y meterme en el tema, mas que nada.

    Ahora bien, pregunta: Como puedo sacar una tabla a partir de un controller, vista o model? Quiero decir, hay algun truco? Algo con lo que pueda guiarme?

    Me explico, la pregunta es, que si por ejemplo, tendro de X funcion se hace referencia a algun campo de la tabla donde yo pueda decir ”Ah! pues mira! este campo tiene que ir seguro!” jaja. Todo esto es para poder hacer la tabla Fotos.

    Gracias por todo, Pedro. Por la ayuda, por compartir tus conocimientos, por tus animos y tu apoyo. Gracias.

    • Pedro
      / Responder

      El archivo .zip con el codigo es nuevo, si! lo puse que para que le echaras un ojo, te lo dije en mi ultimo comentario.
      Espero que te sirva.
      No entiendo pregunta?! a que te refieres con sacar una tabla?! a consultar la informacion de una tabla, puede ser?!

  10. IM
    / Responder

    Gracias (otra vez) por todo y por ser sutil al decirme que estoy mas perdido que Wally jaja. Que es muy cierto, por cierto. Es mi primer contacto con Cake y estoy hecho un lio. Pero bueno, eso no viene al caso. Se que intento empezar la casa por el tejado, pero es lo que me han pedido y tengo que hacerlo jaja.

    Tienes razon en todo, estaba accediento a una ruta como la que comentabas y no a la que debia. Ahora me las apañare para hacer el controlador (a ver que sale) y su tabla.

    Para no darte mas la paliza, sabes del algun tutorial o curso que pueda estudiarme?

    Esto es de locos y va a estallarme la cabeza. Llevo varios dias leyendo y leyendo y he buscado lo que te pido, pero no encuentro nada que empiece por algo basico y vaya evolucionando, todo empieza con cosas que no entiendo jaja.

    Un saludo Pedro y de verdad, mil gracias por todo

    • Pedro
      / Responder

      jejeje es que te has metido con una cosa bastante compleja, yo llevo casi 1 año con cakephp y esto es de lo último que he hecho.

      Primero prueba cosas mas sencillas.

      En la web oficial tienen un tutorial para hacer un blog sencillito que esta muy bien y te puede orientar mucho
      http://book.cakephp.org/view/219/Blog

      De todas maneras al principio se requiere tiempo para entender y aprender.

      Buena suerte y cualquier cosa me comentas! 🙂

  11. IM
    / Responder

    Si, Pedro. Tengo el modelo y la DB con su tabla creadas.

    Te dejo un esquema:

    app/controllers/components/swf_controller.php
    app/controllers/archivos_controller.php
    app/models/archivo.php
    app/views/post/subir_imagenes.ctp

    + El arbol de directorios que pusiste tu arriba. Todo en su sitio, creo.

    Siento muchisimo rayar tanto, nuevamente gracias por tu respuesta 🙂

    • IM
      / Responder

      No puedo editarme, asi que añado algo mas.

      Dandole vueltas al tema y viendo que me pide que cree la clase SwfUpload.phpController (lo que me extraña es lo del .php) pues decidi coger de:

      var $components = array(‘SwfUpload’); //Que esta en el archivo archivos_controller.php

      La cadena ‘SwfUpload’ y asinarlasela a la variable $name del archivo swf_upload.php

      Era lo que me parecia logico, pense que archivos_controller intentaba buscar a sw_upload.php por el nombre SwfUpload y que no lo encontraba pues en swp_upload.php se declaraba como nombre SwfUploadComponent en la linea “var $name = ‘SwfUploadComponent’;”

      Resumiendo, que cambie:

      var $name = ‘SwfUploadComponent’;

      Por:

      var $name=’SwfUpload’;

      Y que paso¿? Nada. xD

      Sigo buscando. Te posteo esto, para que veas que le doy vueltas al tema y que no pregunto por preguntar y sin probar las cosas. Ademas, pienso que si alguien un dia se topa con esto y le surge el mismo problema (que espero que no), no malgaste el tiempo en hacer pruebas que yo ya hice.

      Un saludo!

      • Pedro
        / Responder

        lo de .php sale porque estarás poniendo una url del tipo
        http://www.mi_aplicacion.com/swupload.php

        Esto es un componente que añades a a una aplicación.

        Tu aplicación puede ser la de crear post, subir imágenes o lo que sea con sus respectivos controladores, tipo:
        http://www.mi_aplicacion.com/posts
        o
        http://www.mi_aplicacion.com/fotos

        donde posts o fotos es el controller principal (posts_controller.php, fotos_controller.php) y donde incluyes el componente:

        var $components = array(‘SwfUpload’);

        Lo que te esta pasando es que estas confundiendo este COMPONENTE (app/controllers/components/swf_upload.php) con un controller.

        Primero tienes que crear un controller, si te fijas en la vista que yo he puesto en el ejemplo:

        app/views/posts/subir_imagenes.ctp (o cualquier vista desde la que queráis subir imágenes)

        la vista es del controller posts.

        Adicionalmente a todo esto, el controller archivos que yo he puesto, es un controlador genérico de archivos, que se llama desde cualquier vista de cualquier otro controller.
        archivos_controller.php gestiona las imágenes que envía el componente swfupload y las guarda en una tabla en la BD.

        Creo que tienes un poco de confusión a la hora de elaborar tu aplicación, en cuanto lo veas mas claro te acabará saliendo.

        Échale un ojo a este post, para ver si te aclara un poco más. http://www.pedroventura.com/blog_programacion/2010/01/06/esquema-de-una-peticion-en-cakephp-y-funcionamiento-general-del-framework/

        He recopilado todos los archivos, los he metido en un zip. Dale a este link para ir al post y descargarte todo el código.

  12. IM
    / Responder

    Buenas, Pedro.

    Gracias por tu respuesta. Tengo swf_upload.php colocado donde comentas, y la linea que dices que introduzca ya esta puesta en el codigo del archivos_controller.php (exactamente como esta arriba). Aun asi, sigo topandome con el mismo error.

    La gracia es que el codigo fue copiar y pegar, ademas, revisandolo, creo que cada archivo esta en su sitio. Seguire echandole un ojo y si consigo algo te lo comento.

    Gracias nuevamente!

    • Pedro
      / Responder

      Has creado el modelo? app/models/archivo.php ??? y la tabla?

  13. IM
    / Responder

    He seguido el tutorial al pie de la letra y la verdad es que se agradece que compartas algo asi.

    Aun asi, una vez terminado, intento acceder en local a swf_upload.php y me da error. Me dice que:

    Error: SwfUpload.phpController could not be found.

    Error: Create the class SwfUpload.phpController below in file: appcontrollersswf_upload.php_controller.php

    No lo entiendo… :S

    Un saludo!

    • Pedro
      / Responder

      buenas,
      el error parece que esta intentando acceder al controller swf_upload.php, pero RECUERDA, el primer trozo de código es un COMPONENT, mira bien donde lo tienes que guardar: app/controllers/components/swf_upload.php, luego lo incluyes en tu controller (como lo llames), de la siguiente manera:

      var $components = array(‘SwfUpload’);

      intenta arreglar esto y si no te sale lo seguimos viendo juntos…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Invertir en criptomonedas: »

 

Cómo comprar bitcoin

Invertir y comprar Bitcoin y otras altcoins es más fácil de lo que crees.

1) Si sólo quieres comprar Bitcoin, Ethereum o Litecoin como inversión, tu opción es Coinbase

2) Si quieres probar con otras criptomonedas tu opción es Binance

3) Cualquier duda escríbeme con total libertad al formulario de contacto para resolver dudas: https://www.pedroventura.com/contacto/

¡Comparte este artículo! »

  • Zein (2 días)
    EXELENTEE!!! MIL PUNTOS PARA TI! si me funcionó a la…
  • señales cryptowhale (3 días)
    https://t.me/SignalsWins
  • carlos hernandez (1 semana)
    Hola, hay alguna funcion k sirva para saber el correo…
  • steven (3 semanas)
    tengo un problema me sale este error cuando pongo data:…
  • lewis rod (4 semanas)
    https://t.me/joinchat/Hs_yUFG_xDVJ-PS3cWEYAw este es el enlace me equivoque.
  • lewis rod (4 semanas)
    https://t.me/joinchat/Hs_yUBDhw2Uk7D3D835GJQ grupo de telegram latino sudamericano peru, colombia, ecuador, chile,…

Suscríbete al newsletter »

Proporciona tu correo electrónico a continuación y recibe las últimas noticias! Funciona con Feedburner de Google

Archivo »

Leer entrada anterior
Truco pasar un documento Word a HTML

Cuantas veces os han pasado un documento de Word con decenas de páginas y lo teníais que pasar a HTML??!...

Cerrar