martes, 5 de mayo de 2009

Subir un archivo en Struts

Este tutorial (?) es para aprender (?) a subir archivos correctamente (puro trial and error hasta que me salió) usando el framework Struts 1, asi que si no sabes Struts no sigas leyendo, gracias.

El JSP
Aquí es donde va estar el campo para subir el archivo. Supongamos que ya tenemos el esqueleto del jsp bien configurado y lo que nos falta es lo que vemos en la foto.


En el jsp vamos a tener que poner una cosa asi (en negrita lo importante):

<table align="center">
<tr>
<td align="left">
Fichier a charger <font color="#FF0000">&nbsp;*</font>
</td>
<td valign="top">
<html:file name="massGroupReplacementFileForm" property="replacementFile" style="width:80%;"/>
</td>
</tr>
</table>


Esta tabla va a estar adentro de un form obviamente (el formato es <html:form><table>blabla</table></html:form>) y para que el form tome bien el archivo que subimos tiene que quedar asi:

<html:form enctype="multipart/form-data" action="/admin/massGroupReplacement/fileSave.do">


Ese enctype=blabla es lo que me tuvo a maltraer un buen rato.


El struts-config.xml
Pongo el codigo nomás, it's pretty straightforward (!)

<action path="/admin/massGroupReplacement/fileSave"
name="massGroupReplacementFileForm"
validate="false"
scope="request"
type="com.blabla.admin.struts.MassGroupReplacementFileSaveAction">
<forward name="OK" path="/admin/menu.do" />
<forward name="ERROR" path=
"/jsp/administration/massGroupReplacementFileUpload.jsp" />
</action>


El ActionForm
Pongo el codigo directamente porque también es simple, no hay mucho para decir, solo que el tipo de dato correspondiente al campo del archivo es un FormFile, no un File comun y corriente.

import org.apache.struts.upload.FormFile;

public class MassGroupReplacementFileForm {

private FormFile replacementFile;

public FormFile getReplacementFile() {
return replacementFile;
}

public void setReplacementFile(FormFile replacementFile) {
this.replacementFile = replacementFile;
}
}


El Action
Obviamente uno con ese archivo subido puede hacer lo que carajo quiera, pero que se yo, lo recomendable es copiarlo a una carpeta del servidor para luego hacerle algo.
Entonces obtenemos el FormFile subido y lo metemos en nuestro File, de la siguiente manera:

MassGroupReplacementFileForm rf = (MassGroupReplacementFileForm) form;
FormFile replacementFile = rf.getReplacementFile();
File f = new File("c:\\directorio\\subdirectorio\\pepito.dat");
OutputStream out = new FileOutputStream(f);
out.write(replacementFile.getFileData());
out.flush();
out.close();


En un futuro próximo veremos como carambas se hace esto en Struts 2. Chau.