form conjuntamente con input type fle, type text y otros

form conjuntamente con  input type fle, type text y otros

De forma general  el uso del <form> .. </form>  es con tipos text, checkbox ,. radio,hidden y actualmente con html5 con nuevas opciones como email, date number etc, son del trabajo cotidiano de la programación en la web, incluso en algunos casos también con type="file" que nos permite eventualmente seleccionar archivos para ser descaragados a nuestro sistema, hasta hay nada nuevo y no suelen haber muchos inconvenientes en este manejo, el problema surge cuando se trata de combinar los distintos type y se incluye en ellos un type="file".

En el caso a continuación se ilustra el caso:

---------------------------------------------------------------------------------------------------------------------------
     <form name    = "myFormato" enctype="MULTIPART/FORM-DATA"
           method  = "post"
           action  = "./CorreoCrear.jsp"
           onsubmit= "return validate()"
     >

     <center>
     <table border=4 cellpadding="0" cellspacing="0"
            bgcolor=<%=colorZona%>>

        <tr>
           <td>
               <font color=<%=colorNecesario%> size="4">
                  Asunto
               </font>
           </td>
        </tr>

    <tr>
           <td align=center>
               <input class = "correoAsunto" required
                      name  = "correoAsunto"
                      type  = "text"
                      size  = "50"
                      value = ""

                >
           </td>
        </tr>

    <tr>


       <tr>
           <td>
             <font color=<%=colorNecesario%> size="4">
               Correo
             </font>
        </tr>

        <tr>
           <td  align=center>
                <textarea  class="correoCuerpo" required
                           name ="correoCuerpo"
                           cols ="100"
                           rows ="15">
                </textarea>

          </td>
    </tr>

        <tr>
          <td>
              <font color=<%=colorNoNecesario%> size="4">
               Adjunto
              </font>
          </td>
    </tr>
    <tr>
          <td align=center>
             <input type="file" name="correoAdjunto" />
          <td>
    <tr>


       <tr>
           <td bgcolor=<%=colorFondoGrabar%> colspan=2 align=center>
               <input type="image" name="grabar" src="../imagenes/Grabar.gif" >
                  <font color=<%=colorGrabar%> size="5">
                     Grabar
                  </font>
           </td>
        </tr>
    </table>
</form>
----------------------------------------------------------------------------------------------------------

 Lo primero que hay que tener en cuenta es que bajo el mismo <form></form>
se debe definir UN SOLO enctype, en los casos generales es sistema lo coloca por defecto y es enctype="application/x-www-form-urlencoded" , si se deja aí para type="File" no funciona , entonces hay que cambiarlo como en el caso que nos ocupa a enctype="MULTIPART/FORM-DATA".
Pero se nos presenta un problema y es que al definir el nuevo enctype, la entrada de datos ya NO ESTA EN EL CLIENTE sino en el servidor y por lo tanto
nuestro convencional request.getParameter("correoAsunto") NO FUNCIONA, para ninguno de los input defindos , por lo dicho atras, es neesario
entonces recurrir a una forma un poco mas elaborada para conseguir el nombre de los campos y sus valores.

El sistems se va en utilizar

FileItemFactory file_factory = new DiskFileItemFactory() ;                 ServletFileUpload servlet_up = new ServletFileUpload(file_factory)        ;
List <FileItem> items        = servlet_up.parseRequest(request)           ;         for (FileItem item : items)

Que nos permite  revisar un lista de par/valor con los nombres de los
campos y su contenido en la variable de tipo List items, en la itereacción
sobre la lista preuntamso si el campo obtenido es de tipo convncional o
un campo de almacenamiento de archivos tipo file, en cado caso hacn un
proceso independente para almacenar y operar con los disitntos valores.
En el caso que nos ocuoa de ua forma burda con animos de demostración se indica como obtiene las variables correoAsunto, correoCuerpo y correoAdjunto
para que esten alineados con los valores indicados en los correspondientes
<input>
En el caso especifico del archivo,  almacena el contenido del archivo descargado
en un una carpeta del servidor /usr/local/tomcat/webapps/sosadmor/correos/

Desde allí usando el documento anterior , http://cac9999.blogspot.com/2014/02/envio-de-un-email-con-texto-html-e.html , puedo enviarlos por un correo, o solo almacenarlos para presentarlos más tarde.

mediante

                 File archivo_server = new File(correoAdjunto)                ;
                    item.write(archivo_server)                                        ;

 

 archivoContenido = item.getInputStream() , fue utilizado en otro contexto
para enviar un correo con la información del archivo adjunto , sin
almacenarlo previamente , sino de fomra directa, mediante la interafce  DataSource .


--------------------------------------------------------------------------------------------------------------------

<! recordar instalar en tomcat/lib los archivos jar                    >
<! commons-fileupload-1.2.2.jar  commons-io-2.4.jar                    >
<! para que el capturador de archivos file funcione.                   >


<%@ page language="java"

    import="java.io.*"
    import="java.util.*"
    import="java.text.*"
    import="javax.mail.*"
    import="javax.mail.internet.*"
    import="javax.activation.*"
    import="java.util.Date"

    import="org.apache.commons.fileupload.*"
    import="org.apache.commons.fileupload.disk.*"
    import="org.apache.commons.fileupload.servlet.*"
    import="org.apache.commons.io.*"


// Defino algunas variables de interes mas adelante

    String campoNombre                = new String() ;
    String campoValor                    = new String() ;
    String archivoNombre              = new String() ;
    InputStream archivoContenido = null         ;
%>

       FileItemFactory file_factory = new DiskFileItemFactory()                  ;
       ServletFileUpload servlet_up = new ServletFileUpload(file_factory)        ;
       List <FileItem> items        = servlet_up.parseRequest(request)           ;

        for (FileItem item : items)
           {
            if (item.isFormField())
              {
                // Procesa campos regulares del tipo (input type="text|radio|checkbox|etc", select, etc).

                campoNombre  = item.getFieldName()                               ;
                campoValor = item.getString()                                    ;

                if (campoNombre.equals("correoAsunto"))
                  {
                    correoAsunto = campoValor                                    ;
                  }
                if (campoNombre.equals("correoCuerpo"))
                  {
                    correoCuerpo = campoValor                                    ;
                  }
              }

               }
          else
              {
                // Procesa campos del tipo (input type="file").

                campoNombre      = item.getFieldName()                                 ;
                archivoNombre    = FilenameUtils.getName(item.getName()) ;
                archivoContenido = item.getInputStream()                               ;

                if (campoNombre.equals("correoAdjunto"))
                  {
                    correoAdjunto  = "/usr/local/tomcat/webapps/sosadmor/correos/";

                    File archivo_server = new File(correoAdjunto)                 ;
                    item.write(archivo_server)                                                 ;

                  }
              }
            }

Comentarios

Entradas populares