[SOLUCIONADO] Uploadify y los problemas con las sessiones

Uploadify es un magnífico plugin para jQuery que te permite subir varios archivos a la vez mediante flash, de forma totalmente transparente (podeis ver una demo en este enlace).

Realmente, la gran ventaja que yo le veo no es la de subir varios archivos a la vez,esto ya se puede hacer con javascript a pelo, la gran ventaja es que añade una barra de progreso para que el usuario no se desespere.

Además de subir archivos, también se pueden mandar otros datos a la vez que se suben las imágenes (usando scriptData). Lo cual puede ser muy útil si se quiere por ejemplo, mandar los datos de un formulario a la vez que se sube un archivo.

El gran inconveniente de uploadify, es que manda cada archivo por separado. Es decir, si quieres subir 30 archivos, manda cada archivo en una petición HTTP distinta. El problema no es la velocidad, puesto que se pueden paralelizar las subidas, el problema son las distintas peticiones si tienes que adjuntar datos. El hecho de que sean distintas peticiones complica un poco la lógica en el servidor en según que casos…

En fin, recientemente he usado uploadify en un proyecto donde los usuarios debían estar registrados para poder subir archivos. Claro, registrados y logueados en el sistema. El tema es que tras implementar la subida de archivos, no funcionaba… y no funcionaba… y casi me vuelvo loco, hasta que me di cuenta de que uploadify no envia las cookies, y  lógicamente sin cookies el servidor no tiene forma de cargar las variables de sesión, y por tanto, de saber qué usuario está intentando subir qué, y dado que el servidor no tiene forma de saber si es o no un usuario registrado, devuelve un mensaje de error. Total, que una vez detectado el problema de las cookies la solución ha sido simple.

La solución para mantener la sesión con uploadify (y en general cuando el cliente no tiene cookies), es añadir a la URL de subida el nombre de sesión y el identificador de sesión.

En PHP añadir esto a la URL sería algo, tal que:

$url = $url . '?' . session_name() . '=' . session_id();

Una vez hecho esto, problema resuelto ;)

Trackback URL

, , , ,

66 Comments on "[SOLUCIONADO] Uploadify y los problemas con las sessiones"

  1. Oscar Antolinez
    06/03/2010 at 2:21 am Permalink

    Tambien tuve el mismo problema con Uploadfy, tu solución no me parece del todo buena debido a la mala reputacion de las cookies, yo opte por un widget mas estandar asi sea menos vistoso que uploadfy, Ajax Upload: http://valums.com/ajax-upload/

  2. Pau Sanchez
    08/03/2010 at 3:57 am Permalink

    Realmente, lo que he puesto (lo de pasar el número de sesión por GET), es lo que se hace cuando quieres implementar una sesión en el servidor y no hay posibilidad de usar cookies. Así que a mi me parece una buena solución para el problema que estaba intentando resolver (poder subir archivos y mostrar el progreso de esos archivos).

    En cuanto a usar ajax, ya lo hacía así antes de usar uploadify. El problema con ajax es que no hay una forma de mostrar el progreso (en Mozilla sí que se podría http://hacks.mozilla.org/2009/06/xhr-progress-and-richer-file-uploading-feedback/ pero no en los demás navegadores).

    En fin, aunque en mi caso pasé de un uploader en ajax a otro que usa flash, tal vez a otros lectores del blog les interese tu propuesta del uploader con ajax.

    Gracias por tu propuesta!

  3. daniel sanchez
    01/04/2010 at 10:55 pm Permalink

    Pau, me parece interesante tu solucion pero no he podido aplicarlo ami sitio, pero me sale el siguiente error ” Error: $(“#uploadify”).uploadify is not a function
    Archivo de origen: http://localhost/panelEscolar/panel/js/galeria.js ” no me reconoce la funcion uploadify y estoy usando mootols, lo intentado de varias formas pero no queda alguna idea, Gracias por tu tiempo.

  4. daniel sanchez
    03/04/2010 at 10:27 am Permalink

    Pau, voy a dejar la solucion, para quien le sirva en un futuro
    bueno en primera resulta ser que jquery es incompatible con mootools
    y la solucion es dentro de domready escribir esto:
    jQuery.noConflict(); // evito el conficto
    jQuery(‘#uploadify’).uploadify({ // cargo
    ‘uploader’ : ‘../../../config/fotosTem/scripts/uploadify.swf’,
    ‘script’ : ‘../../../config/fotosTem/scripts/uploadify.php’,
    ‘cancelImg’ : ‘../../../config/fotosTem/cancel.png’,
    ‘folder’ : ‘../../../config/fotosTem/uploads/’,
    ‘queueID’ : ‘fileQueue’,
    ‘fileDesc’ : ‘Imagenes’

    });
    y donde mandamos llamar el jquery ira asi osea html
    Cancelar todas las cargas activas
    listo funciona perfectamente

  5. Pau Sanchez
    08/04/2010 at 1:04 am Permalink

    Efectivamente, si usas mootools o cualquier otra biblioteca de javascript, como casi todas usan la función $ de forma distinta, hay colisión, y se arma la de Dios.

    Como has comentado, la solución es usar el jQuery.noConflict(); y luego usar jQuery en vez de $.

    Gracias por compartirlo ;)

  6. Bruce
    21/05/2010 at 5:26 pm Permalink

    Pau, voy a dejar la solucion, para quien le sirva en un futuro
    bueno en primera resulta ser que jquery es incompatible con mootools
    y la solucion es dentro de domready escribir esto:
    jQuery.noConflict(); // evito el conficto
    jQuery(‘#uploadify’).uploadify({ // cargo
    ‘uploader’ : ‘../../../config/fotosTem/scripts/uploadify.swf’,
    ‘script’ : ‘../../../config/fotosTem/scripts/uploadify.php’,
    ‘cancelImg’ : ‘../../../config/fotosTem/cancel.png’,
    ‘folder’ : ‘../../../config/fotosTem/uploads/’,
    ‘queueID’ : ‘fileQueue’,
    ‘fileDesc’ : ‘Imagenes’

    });
    y donde mandamos llamar el jquery ira asi osea html
    Cancelar todas las cargas activas
    listo funciona perfectamente

  7. Juan M
    03/01/2011 at 4:20 pm Permalink

    Otra forma, para evitar tener que escribir continuamente JQuery, sería declarar una variable más corta de esta forma:
    j = jQuery.noConflict();

    De ese modo hemos cambiado el ‘$’ por ‘j’.

    Un saludo.

  8. Pau Sanchez
    06/01/2011 at 3:05 pm Permalink

    @Juan M, me mola tu solución ;)

  9. paco elearn
    08/02/2012 at 1:57 pm Permalink

    La solución completa es
    En el código Javascript

    $("#upload").uploadify({
    ...
    'scriptData': { 'session': ;'}
    ...
    });

    Y el código PHP en upload.php

    if ($_REQUEST['session']) session_id($_REQUEST['session']);

    Inormación completa en

    http://www.uploadify.com/faqs/how-do-i-send-the-session-id-to-the-back-end-script/

  10. paco elearn
    08/02/2012 at 2:00 pm Permalink

    La solución completa es
    En el código Javascript.Ojo hay que cambiar los carcteres raros despues de session a =>

    $("#upload").uploadify({
    ...
    'scriptData': { 'session': '<?php echo session_id();?>'}
    ...
    });

    Y el código PHP en upload.php

    if ($_REQUEST['session']) session_id($_REQUEST['session']);

    Inormación completa en

    http://www.uploadify.com/faqs/how-do-i-send-the-session-id-to-the-back-end-script/

  11. Carlos
    15/02/2012 at 3:43 pm Permalink

    Hola, he integrado esta utilidad en http://www.artesingular.es/imagen.php pero veo como el 60% de los usuarios (aprox) no consiguen subir nada al servidor. Sin embargo, en mis PCs funciona corréctamente.

    ¿Alguna idea de los motivos?. ¿Vosotros lo visualizais bien?

    Un saludo.

Hi Stranger, leave a comment:

ALLOWED XHTML TAGS:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Subscribe to Comments