File upload con JSP
Liberías[editar]
Para subir ficheros al servidor con JSP, necesitamos librerías adicionales. Una de las más usadas es apache-commons-fileupload, que necesita también apache-commons-io. Debemos descargarlas y ponerlas en el lib de nuestra aplicación web.
Hay más librerías que permiten hacer lo mismo. Incluso puede que sea posible hacerlo sin librerías, pero una búsqueda rápida en google no me ha dado resultados.
Formulario[editar]
En html el formulario para subir se puede parecer a esto
<form action="subefichero.jsp" enctype="multipart/form-data" method="post"> Fichero: <input type="file" name="fichero"/></br> <input type="submit" value="Subir fichero"/> </form>
el formulario debe ser enctype="multipart/form-data" para que admita el envío del fichero. La primera pega que encontramos con JSP es que si el envío el multipart, no funcionan las llamadas a request.getParameter(), siempre devuelven null. Por ello, si el formulario tiene más campos que necesitemos leer, debemos delegar toda la tarea en la librería apache-commons-fileupload
En action hemos puesto una página jsp subefichero.jsp que es la que recibirá el submit de este formulario. Podría ser también un servlet.
Parte del servidor[editar]
En la página JSP o Servlet donde recibimos el formulario, debemos realizar el siguiente código para tratar los datos recibidos, con clases de apache-commons-fileupload
FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); // req es la HttpServletRequest que recibimos del formulario. // Los items obtenidos serán cada uno de los campos del formulario, // tanto campos normales como ficheros subidos. List items = upload.parseRequest(req); // Se recorren todos los items, que son de tipo FileItem for (Object item : items) { FileItem uploaded = (FileItem) item; // Hay que comprobar si es un campo de formulario. Si no lo es, se guarda el fichero // subido donde nos interese if (!uploaded.isFormField()) { // No es campo de formulario, guardamos el fichero en algún sitio File fichero = new File("/tmp", uploaded.getName()); uploaded.write(fichero); } else { // es un campo de formulario, podemos obtener clave y valor String key = uploaded.getFieldName(); String valor = uploaded.getString(); } }