MainMas de MiEndorfinaSoftware LibreArchivos de Blog
|
DesarrolloBueno ahora un tutorial sobre como manejar archivos subidos por el usuario con servlet's, la razón, no encontré mucha información actualizada sobre el tema. Primero hay que bajar el API que nos brinda apache, la cual está el paquete org.apache.commons.fileupload esta API es necesaria ya que trae las clases que se usarán, probablemente a la hora de correrlo hará falta que bajen también org.apache.commons.io, ya que probablemente a la hora de correlo les lanze un ClassNotFoundException, estos dos paquetes deberían ponerlo dentro de WEB-INF/lib/ en el contexto de su aplicación. (nota: los archivos del enlace son un targezeta o un zip, según su gusto, con el javadoc de la API y un .jar con las clases, y si lo bajaron con código también el código, dentro de WEB-INF/lib/ y en el CLASSPATH del compilador deberán colocar el jar correspondiente a estas API's y no el targezeta, osea hay que descomprimirlo!) Ahora importamos lo que necesitaremos: [code='Java'] import java.util.List; import java.util.Iterator; import java.io.File; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.*; import org.apache.commons.fileupload.servlet.*; [/code] Ahora obtener el archivo es bastante simple, primero necesitamos un FileItemFactory, que es así como el handler, el cual como su nombre lo dice nos va a crear los FileItem asociados a la petición, en este caso instanciamos un DiskFileItemFactory el cual nos permite escribir el archivo en el disco dentro de algún directorio temporal en caso de que el archivo sea demasiado grande para tenerlo en memoria. [code='Java'] DiskFileItemFactory factory = new DiskFileItemFactory(); // indicamos el tamaño máximo en memoria que tendrán los archivos factory.setSizeThreshold(4096); // indicamos el directorio temporal que contendrá los archivos factory.setRepository(new File("tmp")); [/code] Ahora por medio de ServletFileUpload es que parsearemos el contenido de la petición para "fabricar" los archivos contenidos en la petición.
[code='Java']
ServletFileUpload upload = new ServletFileUpload(factory);
// indicamos un tamaño máximo para los archivos
upload.setSizeMax(1024 * 512);
// parseamos y obtenemos los FileItems dentro de un List de objetos
// FileItem apartir de la petición.
List items = upload.parseRequest(request);
// si, yo tampoco se por que no se les ocurrió retornar una
// lista usando tipos genéricos Ahora iteramos la lista y procesamos los archivos y otros campos obtenidos por el form según el gusto de cada quien ejemplo, escribiendo el archivo en un directorio conocido en el servidor: [code='Java'] Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String nombre = item.getFieldName(); String valor = item.getString(); out.println(" Campo normal"); out.println("Nombre: " + nombre + ""); out.println("Valor: " + valor + " "); } else { String nombreDelCampo = item.getFieldName(); String nombreDelArchivo = item.getName(); String contentType = item.getContentType(); out.println(" Campo de Archivo"); out.println("Campo: " + nombreDelCampo + ""); out.println("Archivo: " + nombreDelArchivo + " "); out.println("tipo: " + contentType + " "); // Instanciamos el archivo a crear. File uploadedFile = new File("/home/kno/tomcat-dir/uploads/" + nombreDeArchivo); try { // Escribimos el contenido del archivo subido por el usuario // dentro del archivo que acabamos de instancia. item.write(uploadedFile); out.println("Archivo Creado! "); } catch (Exception e) { out.println("Error: " + e.getMessage()); } } [/code] Así de simple obviamente pueden hacer mas cosas, para mas info chequen el JavaDoc de la API, este tutorial es un resumen y traducción no oficial del que pueden encontrar en la página de la API, está interesante, pero en inglés pero es lo mas actualizado que encontré. Acá les pongo el código completo: [code='Java'] import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Iterator; import java.io.File; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.*; import org.apache.commons.fileupload.servlet.*; public class Prueba extends HttpServlet { final static long serialVersionUID = 999988881134L; public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.println(" "); }public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); if (ServletFileUpload.isMultipartContent( new ServletRequestContext(req))) { try { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(4096); factory.setRepository(new File("/home/kno/tomcat-dir/tmp")); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(1024 * 512); List items = upload.parseRequest(req); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString(); out.println(" Campo normal"); out.println("Nombre: " + name + ""); out.println("Valor: " + value + " "); } else { String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); out.println(" Archivo"); out.println("Nombre: " + fieldName + ""); out.println("Archivo: " + fileName + " "); out.println("tipo: " + contentType + " "); File uploadedFile = new File("/home/kno/tomcat-dir/" + "uploads/" + fileName); try { item.write(uploadedFile); } catch (Exception e) { out.println("Error: " + e.getMessage()); } } out.println(" "); } } catch (FileUploadException e) { out.println("Error: " + e.getMessage()); } } else { out.println("No se subió algún archivo."); } } } [/code] Espero que les sirva como me hubiera servido a mi Actualizado.- al parecer el jaws me hizo un desmadre en el código EOT Bueno ayer en la noche me entró lo nerd, he estado leyendo sobre patrones de diseño así que mi cabeza empezó a volar, primero rediseñé por completo el diseño del core del CMS que hice en las residencias, realmente me vinieron unas ideas muy locas a la cabeza, haciendo mas loose-coupled el asunto, mas reusable y mas mantenible, separando todo lo que fuera a variar, y favoreciendo la composición a la herencia, ya que el diseño inicial creo que hubiera dado algunos problemas a la hora de modificar el core mas adelante, entonces para checar que todo jalara empecé por implementarlo, con el pretexto que era un diseño nuevo, por lo que todo sería desde cero y para sacarme la espinita decidí hacerlo ahora en java, excelente idea, en el diseño anterior la implementación del manejo de plantillas (que es por donde empecé) eran apróximadamente 270 líneas de código bastante sucio (que mas se puede esperar de PHP Ahora el título, esto por que por obvias razones uso expresiones regulares para parsear la plantilla, nunca había usado el API de expresiones regulares que trae java, al principio se me hizo medio bizarro ya que estaba acostumbrado al manejo de php y perl, pero después, pensando en objetos, me di cuenta que era demasiado coherente y bueno, me gustó, pueden checarlo en el javadoc de java.util.regex recuerden, antes de criticarla piensen en objetos Bueno chao. Pus pa la bola de weyes que sigue usando java 1.4.2 y que dicen ser muy acá en eso del java les informo que ya está el java 6 (1.6) lo liberaron hace una semana, lo pongo por acá por que me cagan los que me piden que les eche la mano en algo de java y luego no jala lo que hice en casa pues yo trabajo con la 1.5 y se peen por que les digo que actualicen (ahora ya me cambié a la 6) y ellos siguen con la anciana 1.4.2 Bueno chao. Pues hace rato en #VeraLinux degantyll me preguntó si abría una función o variable de PHP para obtener la IP de la máquina de una interfaz específica, le dije que le diera ifconfig y con preg_match sacara la IP, pero como apenas empieza el a programar no conoce las expresiones regulares, de hecho poco ha manejado php, por lo que le hice una función para hacer esto, no se si ya exista otra, la verdad no me puse a buscarla (se me hizo mas fácil hacerla yo mismo que buscar [code='PHP'] /** * Obtiene la dirección IP de una interfaz de red * por medio de ifconfig * * @param string $iface interfaz de la que se busca la IP * default: eth0 * @return string dirección IP en formato 0.0.0.0 */ function getIfaceIP($iface = 'eth0'){ exec('/sbin/ifconfig ' . $iface, $ifOutArr); // ejecutamos ifconfig, guardando TODA la salida en $ifOutArr $ifIPOut = $ifOutArr[1]; // solo necesitamos la parte donde está la ip $iAddrExp = "/inet\saddr:"."([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/"; // expresión regular, donde ponemos el patrón que buscamos // ya que $ifIPOut contendría la IP, máscara, broadcast etc // y solo queremos inet address. Aparte separamos la IP // poniendo el patrón de la IP entre () if (preg_match($iAddrExp, $ifIPOut, $match)) { // si encontró el patrón... $ip = $match[1]; // entonces la IP está en match[1] } else { // si no encontró el patrón es que no arrojó la IP ifconfig $ip = 'No se pudo determinar la IP de la interfaz: '.$iface; // le informamos al usuario lo sucedido } return $ip; // retornamos el resultado } // ejemplo de uso: echo getIfaceIP('eth0'); [/code] Pus a ver si les sirve Bueno chao Pos nada el otro día peleando con unos tipos de la escuela me percaté, bueno no, ya lo había notado desde antes, ese pleito no mas hizo que me dieran ganas de escribir sobre ello. Pues sucede que muchos, pero muchísimos andan por el mundo dicendo saber programar en C y C++, ves su código y te das cuenta que no es ni C ni C++, es una mezcla bizarra entre los dos, es lo que yo le llamo C/C++ y pues no me molesta que exista eso, me encabrona la gente que dice saber programar en ambos lenguajes creyendo que la única diferencia entre los dos es que C++ usa clases …, que en efecto es algo que los hace diferentes pero no es lo único, entonces es cuando hacen esto: #include
main(){ cout << “hola mundo” << endl; } y aseguran que escribieron un programa en C …, a ver vamos a empezar, dicen entonces que la diferencia es que C++ usa clases, bueno, lamento informales que cout es un objeto de la clase ostream declarado en el archivo de cabecera iostream.h, por lo cual no es C, entonces, ¿Es C++?, no, tampoco, ya que el estándar de C++ dice que los archivos de cabecera de C++ no se les pone la extensión al incluirlos y especificar el espacio de nombres que se usará, por lo cual el código está hecho en eso que le llaman C/C++. Otro ejemplo de C/C++: #include
Dicen, el programa está hecho en C, por que no usa clases, OK, no hay instancias de ninguna clase, usan las bibliotecas estandar de C, pero sin embargo no es C, ¿Por qué?, fácil, new y delete no son parte del lenguaje C, son de C++, entonces, ¿el código está escrito en C++?, NO, ¿Por qué?, pues como dije antes, no se usa .h al incluir una cabecera, pero, ¿Si no tuviera el .h sería C++?, tampoco, stdio.h es un archivo de cabecera de la biblioteca estándar de C, pero si C++ permite usar la biblioteca estándar de C!!, así es, pero, en C++ si se usan las cabeceras de la biblioteca estándar de C, lleva una ‘c’ antes, osea se incluyen así: #include main(){ int *ptr; ptr = new int[12]; ... delete ptr; } Y de ahi sale el pretexto clásico: pero compila!!, así es compila, pero el hecho de que compile no quiere decir que se apega al estándar, debido a que los compiladores de C++ deben de ser capaces de compilar código de C, y pues también por eso esa gente piensa que el compilador de C es también compilador de C++, pero no, esto es, un compilador de C++ compila código de C, pero un compilador de C NO compila código de C++. Y de esto llegué a la conclusión de: la culpa de esto es de: 1.-los maestros mas que nada, por que, en el caso de mi escuela, te dan para compilador el de Borland C++, apesar de que la materia se enfoca en C, te dan un compilador de C++, también te piden que uses iostream.h en lugar de stdio.h, la extensión te dicen que debe ser cpp ya que es la extensión por default de Borland C++ y te enseñan a usar new y delete en lugar de *alloc y free ya que les da weba o lo mas seguro no saben lo que son, y cuando pasas a progra 2 que aquí ven C++ te hacen creer que efectivamente la única diferencia es la orientación a objetos, cosa que es triste en verdad, sin mencionar el que hacen creer al alumno que para escribir código en C se necesita el editor de borland C++, haciendo creer al alumno que IDE y compilador son la misma cosa, y aparte los libros de texto que recomiendan, tema del siguiente punto. 2.-Libros de texto, en mi caso, todos los maestros de programación 1(tema de estudio C), recomiendan el de deitel y deitel, el cual pues es una basura en muchos aspectos y se come muchas partes del estándar de C y de C++, tal vez por que el nombre es como programar en C/C++, solo que no especifica que C/C++ no está definido por ningún estándar y en ninguna parte del libro dan una explicación de que son cosas distintas, lo único que dicen es que C fué hecho por Kernighan y Ritchie y que C++ por Stroustrup. Por esto cualquier ideota que lea tal libro creerá que la única diferencia es el manejo de clases y el manejo de entradas y salidas, un claro ejemplo de gente así es el ingeniero Marco Alberto Romo Medina, el tipo que me dió progra 2, el cual realmente es nefasto como programador y maestro. Y pues como el de deitel y deitel hay miles de libros que enseñan C/C++ en lugar de C o C++ pero no ambos. 3.-Uno mismo, ¿Por qué?, por que somos tan pendejos que no nos ponemos a investigar y aprender por nuestra cuenta y dejar que nuestro criterio nos lleve a ver quienes tienen la razón si Deitel y Romo o Kernighan, Ritchie y Stroustrup. He dicho, por favor si me equivoco en algo coméntenlo!!, no soy perfecto y algo se me pudo haber escapado, claro que tampoco lo hagan con el afán de castrar, y sus comentarios fundamentenlos. Por cierto, al rato toca endorfina!!!!!!! Bueno chao. Nota: de los ejemplos de código también se podría mencionar el hecho de que main debe regresar un entero etc. los cuales no mencioné para no caer en lo mamón. He estado escuchando: |
AmigosBlen (flog)Hokum Chao (flog) Maur0 Bty (flog) Moy djmaucom Pau(mi hermana la loca) Hokum(blog) Tonyto ¿Quien soy?Soy un tipo un tanto diferente al promedio, tal vez una especie de geek-nerd-freak, lo que mas me pasa es la ciencia ficción, la cultura japonesa tanto clásica como moderna, las computadoras, y todo lo que hay al rededos de estos 3 ejes, la neta soy chido, o al menos eso me gusta creer (pronto mas). Endorfina
Categorías
|