jueves, noviembre 04, 2010

Java - Subir archivo en Servidor con Java


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"


1. Entorno


  • JDK 6 Update 21
  • Netbeans 6.9.1
  • Apache Tomcat

2. Introducción


Que es mas preferible guardar un archivo en el servidor o guardar la imagen en una base de datos ???? Creo que la respuesta es mas que obvia, guardar la imagen en el servidor debido a que guardarlo en la base de datos nos llevaría a que nuestra base de datos se congestione y los procesos de obtención de datos se vuelva mas lento. Es por ello que siempre nos encontramos con la necesidad de subir archivos a nuestros servidor para poder luego descargarlas. En el siguiente ejemplo se mostrara como poder subir un archivo a nuestro servidor usando para ello el lenguaje Java.

3. Desarrollo del ejemplo


3.1  Crear proyecto en Netbeans

Se debe de crear un proyecto Web en Netbeans el cual lo llamaremos "SubirArchivo" y seleccionar como servidor el Apache Tomcat


















3.2. Agregar las librerías

Ademas se tiene que agregar las librerías necesarias para poder subir los archivos al servidor, esas librerias son las siguientes:

  • struts.jar
  • uploadbean.jar
  • cos.jar
  • fileupload.jar
  • progress.jar



















3.3. Crear JSPs

Se crean dos Java Server Page (JSP). El primer JSP llamado index.jsp que va a ser el encargado se subir el archivo al servidor y el otro llamado error.jsp donde se mostrar un mensaje diciendo que el archivo no es valido cuando se trata de subir un archivo con las extensiones no adecuadas.




















3.4. Pagina index.jsp

Ya dijimos que la pagina index.jsp va a ser el encargado de subir el archivo al servidor. Para ello se debe de realizar el siguiente diseño













El cual tiene los siguientes componentes:













Al inicio del archivo de la pagina debemos de agregar las importaciones que vamos a utilizar y la ubicación de la carpeta donde queremos que se guarde los archivos

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page language="java" import="javazoom.upload.*" %>
<%@page language="java" import="java.util.*" %>
<%@page errorPage="error.jsp" %>

<%
    String direccion = request.getSession().getServletContext().getRealPath("imagenesDB/");
%>

<jsp:useBean id="upBean" scope="page" class="javazoom.upload.UploadBean" >
    <jsp:setProperty name="upBean" property="folderstore" value="<%= direccion%>" />
    <jsp:setProperty name="upBean" property="whitelist" value="*.jpg,*.gif" />
    <jsp:setProperty name="upBean" property="overwritepolicy" value="nametimestamp"/>
</jsp:useBean>

Y después de haber declarado el form de la pagina, poner las siguientes lineas de codigo. Exactamente después de <form method="post" action="index.jsp" name="upform" enctype="multipart/form-data">

<%
if (MultipartFormDataRequest.isMultipartFormData(request)) {
 MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
 String todo = null;
 if (mrequest != null) {
  todo = mrequest.getParameter("todo");
 }
 if ((todo != null) && (todo.equalsIgnoreCase("upload"))) {
  Hashtable files = mrequest.getFiles();
  if ((files != null) && (!files.isEmpty())) {
   java.text.SimpleDateFormat formato = new java.text.SimpleDateFormat("yyMMddHHmmss");
   String archivo = ((UploadFile) mrequest.getFiles().get("uploadfile")).getFileName();
   int posicionPunto = archivo.indexOf(".");
   String nombreImagen = archivo.substring(0, posicionPunto);
   String extension = archivo.substring(posicionPunto);
   nombreImagen = nombreImagen + formato.format(new java.util.Date());
   nombreImagen = nombreImagen + extension;
   ((UploadFile) mrequest.getFiles().get("uploadfile")).setFileName(nombreImagen);
   UploadFile file = (UploadFile) files.get("uploadfile");
   if (file != null) {
    out.println("El archivo: " + file.getFileName() + " se subio correctamente");
   }
   upBean.store(mrequest, "uploadfile");
  } else {
    out.println("Archivos no subidos");
  }
 } else {
   out.println("<BR> todo=" + todo);
 }
}
%>

3.5. Pagina error.jsp

En la pagina de error solo nos mostrara un mensaje que nos dirá que el archivo que se permite subir no es valido y nos permitirá volver al inicio


<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1><strong>El tipo de imagen no es el correcto, usted solo puede subir del tipo: </strong></h1>
        <ul>
            <li><strong>GIF</strong></li>
            <li><strong>JPG</strong></li>
        </ul>
        <p><strong>Haga click <a href="javascript:history.back()">AQUI </a>para retornar </strong></p>

    </body>
</html>

4. Ejemplo de la aplicación


Debemos de buscar la imagen que deseamos subir, recordar que las imágenes aceptados son las JPG y GIF, para ello presionamos el botón Examinar y luego para subir el archivo presionamos el botón Agregar.





















Si se subió la imagen correctamente, nos mostrara la información de la imagen que se subió














La carpeta donde se guardo la imagen

5 comentarios:

/*********SERVLET**********/

public class ServletSubida extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String nombreArchivo = "";
try {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart){
DiskFileItemFactory factory = new DiskFileItemFactory();
// tamaño por encima del cual los ficheros son escritos directamente en disco
factory.setSizeThreshold(4096);
// directorio en el que se escribirán los ficheros con tamaño superior al soportado en memoria
factory.setRepository(new File("c:\\" ));
ServletFileUpload upload = new ServletFileUpload(factory);
//El tamaño maximo de los achivos a cargar
upload.setSizeMax(1024 * 1024 * 20);
// ordenamos procesar los ficheros
List items = upload.parseRequest(request);
for (int i = 0; i < items.size(); i++){
FileItem item = (FileItem) items.get(i);
//Si no es un archivo solo mostramos su valor
if (item.isFormField()){
}
// Si es un archivo lo guardamos como lo tenias
else{
String fileName = item.getName();
nombreArchivo = fileName;
StringTokenizer token = new StringTokenizer(nombreArchivo);
nombreArchivo = "";
while (token.hasMoreTokens()){
nombreArchivo += token.nextToken();
}

// construimos un objeto file para recuperar el trayecto completo
File fichero = new File(fileName);
// nos quedamos solo con el nombre y descartamos el path
fichero = new File("c:\\pruebas\\" + nombreArchivo );
// escribimos el fichero colgando del nuevo path
item.write(fichero);
}
}
request.setAttribute("MENSAJE", "ARCHIVO SUBIDO CON EXITO");

this.getServletContext().getRequestDispatcher("/PAGINADESTINO.JSP").forward(request, response);
}
} catch (FileNotFoundException ex) {
request.setAttribute("mensaje", "Solo Archivos de menos de 20 MB");

this.getServletContext().getRequestDispatcher("/PAGINADESTINO.JSP").forward(request, response);

} catch (Exception exs) {
Logger.getLogger(ServletSubida.class.getName()).log(Level.SEVERE, null, exs);
} finally {
out.close();
}
}
}

muchisimas gracias me sirvió de mucho, pero tengo una duda..como hacer para que acepte todo tiempo de archivos, sin exceder un limite de bytes ? x decir que aguante hasta 10Mb...

En la parte superior Bengy el amigo alan te da otro metodo alternativo para poder subir los archivos con el tamaño desde un servlet ... Saludos

Espero que haya resuelto tus dudas

gracias, muy buen post!