Vamos a ver como subir un fichero al servidor usando el API de Joomla!.

La ventaja de usar el API de Joomla! es que internamente comprueba si se esta usando la capa FTP y si esta configurada se usará para subir el fichero.

Primero creamos una vista donde mostraremos un formulario con un input de tipo “file”. El formulario ha de tener enctype=”multipart/form-data” como atributo, de lo contrario, apache no sabrá interpretar los datos recogidos en la variable post como ficheros. El enctype multipart/form-data especifica que vamos a poder enviar tanto texto como ficheros.

Código de la vista

<form name="registro" id="registro"  action="index.php" method="POST" enctype="multipart/form-data"  >
 
    Introduce el fichero :
<input type="file" name="fichero"  />
<input type="submit" value="Subir Fichero" />
<input type="hidden" name="option" value="com_aplicacion" />
<input type="hidden" name="task" value="subirFichero" />
</form>

La vista es enviada a un task, en este caso el task se llama subirFichero, así que creamos un método en el controlador con este nombre e introducimos el siguiente código :
(Si no entiendes lo que es un task, vista, etc… hay un tutorial bastante extenso sobre componentes donde se explica)

Código del task

$file = JRequest::getVar( 'fichero', null, 'files', 'array' );
 
jimport('joomla.filesystem.file');
 
        if(!is_array($file)){
        	$mensaje .= "NoSeHaSubido";
         }
         if($file['error'] || $file['size'] < 1 ){
			$mensaje .= " NoExisteFichero";
        }
         if( $file['size'] > 100  ){
         	$mensaje .=" FicheroDemasiadoGrande";
             }
 
        if(!JFile::upload($file['tmp_name'],"/directorioLocal".DS. $file['name'])){ 
 
			$mensaje .= " ErrorAlSubirElFichero";
        }

En la primera línea obtenemos el fichero de la petición proveniente del formulario. Investiga más sobre los métodos de JRequest , te será muy útil!!.

La segunda línea sirve para importar el objeto JFile que usaremos para introducir el fichero en nuestro sistema de ficheros local.

Por último llevamos a cabo algunas comprobaciones para ver si el fichero es demasiado grande ,demasiado pequeño o si no se ha subido ningún fichero y vamos guardando en una variable el mensaje de error correspondiente, para que después solo haya que invocar el método upload del objeto JFile al cual le pasamos como primer parámetro el fichero temporal que aún se encuentra en la petición y como segundo parámetro la ruta completa en el disco local (incluyendo el nombre del fichero) donde queremos guardar el fichero.

Ya debería de estar fichero correctamente subido en el disco duro del servidor ;-)

Compartir:
  • del.icio.us
  • BarraPunto
  • Bitacoras.com
  • Facebook
  • Google Bookmarks
  • Meneame
  • Netvibes
  • Technorati
  • FriendFeed
  • Twitter
  • HelloTxt


Comentarios

  1. 1
    Programator
    13 de marzo del 2008 a las 7:49 pm

    ¿Puedo subir cualquier tipo de fichero? ¿Aunque tenga virus?

  2. 2
    David
    14 de marzo del 2008 a las 1:43 am

    Pues si, siempre y cuandoel tamaño máximo no exceda a el tamaño máximo para descargas especificado en el php.ini.

    Da lo mismo que tenga virus…

  3. 3
    hidabe
    17 de noviembre del 2008 a las 2:34 am

    Buenas David,

    Tengo una pregunta acerca de esto de subir ficheros. Reciéntemente me tocó hacer un upload pero con barra de progeso. Tiré de un script en Perl, UberUpload, creo que fue, me pareció un auténtico coñazo porque la integración en Joomla era un infierno, aparte de los problemas que tuve para hacerlo correr en un servidor Lighttpd.

    Sin embargo, Joomla hace esto en su Gestor Multimedia sin usar Perl, y me gustaría saber si eso es reutilizable a la hora de programar componentes, cómo se haría, y si se puede poner en el front o sólo está permitido en el backend.

    Perdona si son muchas preguntas.

    Muchas gracias por tus aportes!

  4. 4
    hidabe
    18 de noviembre del 2008 a las 4:28 am

    Comento por si puede ser de interés para alguien que en Joomla.org me han dicho que el FancyUpload, herramienta que usaba Joomla 1.5 en su Gestor Multimedia, lo han deshabilitado para la última versión 1.5.8, porque da problemas con Flash10, así que recomiendan que por ahora no se use.

    Muchas gracias nuevamente, saludos!

  5. 5
    David
    18 de noviembre del 2008 a las 7:46 am

    Es cierto, espero que lo solucionen pronto.
    Por cierto Fancy Upload es el que yo uso para mis proyectos, y me funciona muy bien, no usa Perl ni nada, solo php y javascript.

    Muchas gracias por la información.

  6. 6
    Marye
    2 de marzo del 2009 a las 7:53 am

    Hola!
    Estamos usando el joomla 1.0.15 y cuando trato de implementar este codigo me da un error:
    Fatal error: Class ‘JRequest’ not found
    el cual no se como resolver…
    Gracias de antemano!

  7. 7
    Pablo
    7 de mayo del 2009 a las 8:15 am

    Puedo subir pelis, aunque sean porno?,
    Perdon, esque me ha hecho gracia el primer comentario :P

  8. 8
    David
    7 de mayo del 2009 a las 3:13 pm

    Para Marye:

    En Joomla 1.0.x no existe la clase JRequest, es otra API la que usan ellos.

    Para Pablo:
    jajajajja, la verdad es que yo flipé también, este tio no tien que andar muy bien de la cabeza, aún así lo dejé por que me hizo bastante gracia, y le contesté y todo de una forma todo lo tecnica que pudé, jejeje

  9. 9
    peterman
    28 de mayo del 2009 a las 3:35 pm

    Y si ahora quisiera parsear el fichero una vez subido cuales API de Joomla me podrian ayudar en esto?

  10. 10
    Argol
    21 de septiembre del 2009 a las 10:50 pm

    Saludos, deceo en un formulario con varios campos en uno de ellos subir un archivo a una carpeta dentro de un componente y a la vez guardar el nombre del archivo en una tabla de la base de datos, si me pudieras dar una mano con consejos practicos te lo agradeceria mucho

  11. 11
    David
    22 de septiembre del 2009 a las 10:37 am

    Échale un vistazo a este tutorial para crear componentes.
    El resto es programación en PHP.

  12. 12
    Argol
    22 de septiembre del 2009 a las 8:39 pm

    Muchisimas gracias, ya lo vi y esta bueno, ahora a trabajar………