Subir ficheros al servidor con Struts
En Autentia trabajamos a
diario en el desarrollo de aplicaciones Web a partir de las tecnologías de
desarrollo más avanzadas; la más utilizada de éstas es la API de desarrollo de
Aplicaciones Web Struts, de Jakarta.
En este tutorial vamos a crear un sencillo programa para subir archivos a
un servidor. Esta funcionalidad la implementa FormFile (de la librería
org.apache.struts.upload). Esta interfaz es la principal herramienta de subida
de ficheros de Struts; representa un fichero que se desea subir (a un servidor).
Para facilitar la presentación del diseño, optamos por presentarlo
siguiendo el modelo de arquitectura utilizado por Struts: MVC
(Modelo-Vista-Controlador).
1. Modelo: creando un Form Bean
Creamos un Bean UploadForm; este fichero contiene una variable
privada theFile de tipo FormFile, que utilizamos para definir el
modelo de datos de la subida de ficheros. Este es el código del Bean:
package autentia;
import org.apache.struts.action.*;
import org.apache.struts.action.upload.FormFile;
/** * Autor: Miguel Mena
*/
/** * UploadForm.java
*/
public class UploadForm extends ActionForm {
/**
* The file that the user has uploaded
*/
private FormFile theFile;
/**
* The file path to write to
*/
protected String filePath;
/**
* Retrieve a representation of the file the user has
uploaded
*/
public FormFile getTheFile() {
return theFile;
}
/**
* Set a representation of the file the user has
uploaded
*/
public void setTheFile(FormFile theFile) {
this.theFile = theFile;
}
}
|
El controlador accederá a esta variable
utilizando los métodos getTheFile y setTheFile.
2. Controlador (I): creando Action Class
A continuación definimos un Action Class que implemente la
funcionalidad del sistema: UploadAction. Este Bean lee el fichero a
subir, imprime sus parámetros y almacena el contenido del fichero en un array de
salida (configurable); nótese que el máximo tamaño de fichero que permitimos es
4 MB, el máximo que hemos elegido para Struts. Más adelante podremos configurar
este parámetro en el fichero struts-config.xml.
package autentia;
import javax.io.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.upload.*;
/*
* Autor: Miguel Mena
*/
/*
* UploadAction.java
*/
public class UploadAction extends Action
{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (form instanceof UploadForm) {
UploadForm theForm = (UploadForm)
form;
// mostramos los parametros del
fichero
FormFile theFile =
theForm.getTheFile();
String contentType =
theFile.getContentType();
String fileName =
theFile.getFileName();
int fileSize = theFile.getFileSize();
byte[] fileData =
theFile.getFileData();
System.out.println(«Tipo: « +
contentType);
System.out.println(«Nombre: » +
fileName);
System.out.println(«Tamano: » +
fileSize);
try {
//guarda los
datos del fichero
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream
stream = file.getInputStream();
// solo si el
archivo es de menos de 4MB
if
(fileSize() < (4*1024000)) {
byte[] buffer = new byte[8192];
int bytesLeidos = 0;
while ((bytesLeidos = stream.read(buffer, 0, 8192)) != -1) {
baos.write(buffer, 0, bytesLeidos );
}
data = new String(baos.toByteArray());
}
else {
data = new String(«Fichero de más de 4MB: no pudo almacenarse.» +
» Tamano del fichero: » + fileSize() + » bytes.»);
}
}
return mapping.findForward(«success»);
}
// solo si no lee un UploadForm
return null;
}
|
3. Controlador (II): declaraciones en struts-config.xml
Ya tenemos el modelo y el controlador definidos. Ahora
tenemos que declararlos en el fichero struts-config.xml a utilizar en
esta aplicación. Además, también definimos el tamaño máximo a permitir:
<?xml version=»1.0″
encoding=»iso-8859-1″?>
<!DOCTYPE struts-config PUBLIC
«-//Apache Software Foundation//DTD Struts Configuration
1.2//EN»
«http://struts.apache.org/dtds/struts-config_1_2.dtd»>
<struts-config>
<form-beans>
<form-bean name=»uploadForm»
type=»autentia.UploadForm» />
</form-beans>
<action-mappings>
<action path=»/upload» forward=»/upload.jsp» />
<!– Upload Action –>
<action path=»/upload-submit»
type=»autentia.UploadAction»
name=»uploadForm» scope=»request» input=»input»>
<forward name=»input» path=»/upload.jsp»
/>
<forward name=»display» path=»/display.jsp»
/>
</action>
</action-mappings>
<!– This is where you set the maximum file size for your file
uploads.
-1 by default: unlimited size. –>
<controller maxFileSize=»4M» inputForward=»true» />
<message-resources parameter=»autentia.UploadResources»/>
</struts-config>
|
4. Vista: creando upload.jsp y display.jsp
Finalmente, tenemos que diseñar una página JSP que
implemente la presentación de la aplicación en el navegador, a la que llamaremos
upload.jsp. Es importante mencionar que hay que configurar el campo
enctype en la declaracion del formulario como «multipart/form-data»,
es decir, como multiparte:
upload.jsp
<%@ page
import=»org.apache.struts.action.*,
java.util.Iterator,
autentia.UploadForm,
org.apache.struts.Globals» %>
<%@ taglib uri=»/tags/struts-bean» prefix=»bean» %>
<%@ taglib uri=»/tags/struts-html» prefix=»html» %>
<%@ taglib uri=»/tags/struts-logic» prefix=»logic» %>
<html>
<head>
<title>Ejemplo de subida de ficheros</title>
</head>
<body>
<!–
The most important part is to declare your form’s
enctype to be
«multipart/form-data», and to have a form:file
element that maps
to your ActionForm’s FormFile property
–>
<div align=center>
<html:form action=»upload-submit.do?queryParam=Successful»
enctype=»multipart/form-data»>
<p>Introduzca el nombre del fichero a subir: <br />
<html:file property=»theFile» /></p>
<p><html:submit /></p>
</html:form>
</div>
</body>
</html>
|
Por último, implementamos la página para mostrar salida con
éxito:
display.jsp:
<html>
<head>
<title>Upload realizado</title>
</head>
<body>
<p align=»center»>
<font size=»5″ color=»#000080″>Fichero subido con
éxito</font>
</p>
</body>
</html>
|
5. Ejecución
Una vez desplegada, vuestra aplicación Web debería mostrar
la siguiente ventana:
Una vez introducido el fichero a subir, nos devuelve la
correspondiente página de éxito:
me gustaría saber como queda la clase ActionErrors validate, ya que por defecto me arroja esto:
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (getName() == null || getName().length() getTheFile() no? pero me arroja error!..
puedes especificar como es esta clase porfa??
está buenicimo el ejemplo, me falta eso no más para compilar ya que no me reconoce el bean…
saludos
Tengo el mismo problema que la mayoria de la gente. Me funciona, pero, ¿ donde se supone que se guarda el fichero si no le decimos la ruta? ¿ por qué no contesta el autor ? Gracias, salu2
La direccion donde se guarda el archivo es declarada dentro del constructor del baos
un ejemplo seria asi:
ByteArrayOutputStream baos = new ByteArrayOutputStream(\\\»/home/miequipo/f3r/java/\\\»);