sábado, 21 de abril de 2012

Como subir archivos y obtener los datos de una forma con un Portlet

La semana pasada me estuve peleando con un portlet para subir un archivo que se encontraba dentro de una forma, pues en un caso solo podia ver los parametros del request y en el otro solo podia obtener el archivo. Estuve investigando en la red sin exito alguno hasta que llegue a una pagina que hablaba de usar inputStream para leer los campos de la forma asi que aqui les facilito el codigo que necesitan para hacerlo.

Para realizar lo siguiente necesitaremos 2 jars, el de commons-fileupload-1.2.2.jar y el de commons-io-2.2.jar y los agregamos al build path.

Luego importamos los siguientes paquetes en nuestra clase portlet:

import java.io.*
import org.apache.commons.io.IOUtils.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.portlet.*;


Luego agregamos el siguiente metodo a nuestro portlet, que se encargara de procesar los campos del formulario asi como de subir los archivos que tengamos:

@ProcessAction(name="subirArchivo")
public void subirArchivo(ActionRequest req, ActionResponse res) throws PortletException, java.io.IOException{
   String param1 = "";
   PortletFileUpload pfu = new PortletFileUpload();
   String fileExtension = null;
   FileOutputStream outStream = null;
   try {
      FileItemIterator iter = pfu.getItemIterator(request);
      
      while (iter.hasNext()) {
         FileItemStream item = iter.next();
                    
         if(item.isFormField()){
     
            if(item.getFieldName().equals("param1")){
               param1 = IOUtils.toString(item.openStream());
            }
     
         }else {
        
            String fileName = item.getName();
            fileExtension = fileName.substring(fileName.lastIndexOf("."),fileName.length());     
            outStream = new FileOutputStream(getInitParameter("uploadFolder")
            + "\\"
            + "archivoPrueba"
            + fileExtension);
            InputStream stream = item.openStream();
            
            byte[] buffer = new byte[1024];
            while (true) {
               int bytes = stream.read(buffer);
               if (bytes <= 0) {
               break;
            }
            outStream.write(buffer, 0, bytes);
         }
         outStream.flush();      
       }
      }
      }
      } catch (Exception ex) {
         ex.printStackTrace();
         if(outStream != null) {
            outStream.close();
         }
      File file = new File(getInitParameter("uploadFolder") + "\\"
      + "archivoPrueba"
      + fileExtension);
      if (file != null && file.canRead() && file.canWrite()) {
         file.delete();
      }
      logger.debug("Error "+ ex.getMessage());
   }
   finally {
      if (outStream != null) {
         outStream.close();
      }
   }
}
Donde param1 sera el parametro que recibiremos de nuestra forma, y la magia se hace en las lineas 13 al 17 que es donde obtenemos con ayuda de los jars de apache los valores de los campos.

Ahora necesitamos la forma en la cual se subira el archivo y el campo:

Donde definimos el actionURL con el name que le pusimos a la anotacion para que se haga el mapeo de la accion, y el enctype lo definimos como multipart/form-data para indicar que se subira un archivo y datos de una forma.