Está en la página 1de 7

SUBIR IMGENES CON INTERCEPTORES

Struts2 posee una amplia gama de funciones que permiten hacer mas gil el desarrollo y que estn
puestas a disposicin de los desarrolladores a travs de los interceptores que vienen por default.
Usaremos FileUploadInterceptor en nuestro ejemplo para subir el archivo. El Struts 2 Carga de
archivos Interceptor se basa en MultiPartRequestWrapper, que se aplica de forma automtica a la
solicitud si contiene el elemento de archivo.
userImage.jsp
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head></head>
<body>
<h2>File Upload</h2>
<s:actionerror />
<s:form action="userImage" method="post" enctype="multipart/form-data">
<s:file name="userImage" label="Imagen" />
<s:submit value="Cargar"/>
</s:form>
</body>
</html>

SuccessUserImage.jsp
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head></head>
<body>
<h2>File Upload</h2>
NOMBRE : <s:property value="userImageFileName"/>
<br/>
<%-TIPO : <s:property value="userImageContentType"/>
<br/>
RUTA : <s:property value="userImage"/>
<br/>
--%>
IMAGEN :
<br/>
<img src="<s:property value="userImageFileName"/>"/>
</body>
</html>

FileUploadAction.java
import
import
import
import
import

java.io.File;
javax.servlet.http.HttpServletRequest;
org.apache.commons.io.FileUtils;
org.apache.struts2.interceptor.ServletRequestAware;
com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport implements ServletRequestAware{


private File userImage;
private String userImageContentType;
private String userImageFileName;
private HttpServletRequest servletRequest;
public String execute() {
try {
String filePath=servletRequest.getSession().getServletContext().getRealPath("/");

System.out.println("Server path:" + filePath);


File fileToCreate = new File(filePath, this.userImageFileName);

FileUtils.copyFile(this.userImage, fileToCreate);
}
catch (Exception e) {
e.printStackTrace();
addActionError(e.getMessage());
return INPUT;
}
return SUCCESS;
}
public File getUserImage() {
return userImage;
}
public void setUserImage(File userImage) {
this.userImage = userImage;
}
public String getUserImageContentType() {
return userImageContentType;
}
public void setUserImageContentType(String userImageContentType) {
this.userImageContentType = userImageContentType;
}
public String getUserImageFileName() {
return userImageFileName;
}
public void setUserImageFileName(String userImageFileName) {
this.userImageFileName = userImageFileName;
}
@Override
public void setServletRequest(HttpServletRequest servletRequest) {
this.servletRequest = servletRequest;
}
}

private File userImage;-> Esto almacenar archivo real cargado


private String userImageContentType;-> Esta cadena contendr el tipo de contenido del
archivo cargado.
private String userImageFileName; -> Esta cadena contendr el nombre del archivo subido.
Los campos userImageContentType y userImageFileName son opcionales. Si se
proporcionan mtodo setter de estos campos, struts2 establecer los datos. Esto es slo para
conseguir un poco de informacin extra de archivo cargado.
Tambin tenga en cuenta en clase de la accin anterior, hemos implementado la interfaz
org.apache.struts2.interceptor.ServletRequestAware. Se trata de conseguir objeto ServletRequest.
Estamos utilizando esta ruta para guardar el archivo subido en el mtodo execute (). Hemos
utilizado el mtodo FileUtil.copyFile () del paquete commons-io para copiar el archivo subido en la
carpeta raz. Este archivo se recuperar en la pgina JSP y se muestra al usuario.
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="userImage" class="FileUploadAction">
<interceptor-ref name="fileUpload">
<param name="maximumSize">2097152</param>
<param name="allowedTypes">image/png,image/gif,image/jpeg,image/pjpeg</param>

</interceptor-ref>
<interceptor-ref name="defaultStack"> </interceptor-ref>
<result name="success">SuccessUserImage.jsp</result>

<result name="input">UserImage.jsp</result>
</action>
</package>
</struts>

Se ha especificado dos parmetros a fileUpload interceptor, MaximumSize y allowedTypes. Estos


son parmetros opcionales que podemos especificar para interceptor. El parmetro MaximumSize
ser establecer el tamao mximo de archivo que se puede cargar. Por defecto es 2MB. Y el
parmetro allowedTypes especifica los tipos de contenido permitido de archivos que se pueden
subir. Aqu hemos especificado que ser un archivo de imagen (image / gif, image / gif, image / jpeg,
image / pjpeg).
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>UserImage.jsp</welcome-file>
</welcome-file-list>
</web-app>

CARGA DE ARCHIVOS
El interceptor FileUpload est dado de alta en la pila de interceptores del paquete default que
maneja Struts2.
org.apache.struts2.interceptor.FileUploadInterceptor
Si ya tenemos configurado nuestro proyecto solo es necesario agregar estas libreras:
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
Lo primero que haremos es crear un formularioDeCargaDeArchivo.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head> </head>
<body>
<h1>Carga de archivos</h1>
<s:form action="CargaArchivo" method="post" enctype="multipart/formdata">
<s:file name="archivo" label="Agregar Archivo"/>
<s:submit value="Subir"/>
</s:form>
</body>
</html>

Despues creamos la clase AccionCargaArchivo.java que se encargar de recibir y manejar el


contenido del archivo.
import
import
import
import

com.opensymphony.xwork2.ActionSupport;
java.io.BufferedReader;
java.io.File;
java.io.FileReader;

public class AccionCargaArchivo extends ActionSupport {


private File archivo;
private String archivoContentType;
private String archivoFileName;
private String datos = "";
public String execute() {
try {
BufferedReader entrada = new BufferedReader(new
FileReader(archivo));
if (archivoContentType.equals("text/plain")) {
String aux;
while ((aux = entrada.readLine()) != null)
{datos += aux + "\n";}
}
}
catch (Exception e)
{e.printStackTrace();}
return SUCCESS;
}
public File getArchivo() {
return archivo;
}
public void setArchivo(File archivo) {
this.archivo = archivo;
}
public String getArchivoContentType() {
return archivoContentType;
}
public void setArchivoContentType(String archivoContentType) {
this.archivoContentType = archivoContentType;
}
public String getArchivoFileName() {
return archivoFileName;
}
public void setArchivoFileName(String archivoFileName) {
this.archivoFileName = archivoFileName;
}
public String getDatos() {
return datos;
}
public void setDatos(String datos) {
this.datos = datos;
}
}

Del la clase Action anterior observa cuidadosamente las siguientes variables:


File nombreDeArchivo;
String nombreDeArchivoContentType;
String nombreDeArchivoFileName;

La variable de tipo File tiene un nombre arbitrario, sin embargo las otras dos deben cumplir con un
formato establecido para que el interceptor pueda encontrarlas y establecer los datos
correspondientes al tipo de contenido y al nombre del archivo.
archivo - Es el nombre del archivo.
archivoContentType - Contiene el tipo de contenido del archivo.
archivoFileName - Contiene el nombre del archivo tal como fue almacenado en el servidor.
Con esto el Framework a travs del inteceptor toma el archivo y lo relacione con las variables que
declaramos en el Action.
Creamos la jsp de respuesta archivoCargado.jsp, que solo mostrar algunos datos del archivo que
se esta subiendo al servidor.
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head> </head>
<body>
<h1>Archivo cargado con exito</h1>
Nombre del archivo : <s:property value="archivoFileName"/><br>
Contenido del archivo :<br>
<s:textarea name="dat" value="%{datos}" cols="50" />
</body>
</html>

Cambiamos el archivo de configuracin de struts.xml para hacer referencia a las clases y jsps que
acabamos de crear.
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="FormularioCargaArchivo" >
<result>/formularioDeCargaDeArchivo.jsp</result>
</action>
<action name="CargaArchivo" class="AccionCargaArchivo">
<result>/archivoCargado.jsp</result>
<result name="input">/formularioDeCargaDeArchivo.jsp</result>
</action>
</package>
</struts>

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>formularioDeCargaDeArchivo.jsp</welcome-file>
</welcome-file-list>
</web-app>

DESCARGA DE ARCHIVOS
Para descargar un fichero con Struts 2, seguimoes estos 3 pasos:
1. slo tenemos que crear un atributo de tipo FileInputStream en nuestro Action,
asegurndonos de incluir su getter y su setter, de modo que el controlador pueda hacer uso
del mismo.
2. Por otro lado, configuramos un nuevo result de tipo stream en nuestro struts.xml,
3. y crear el enlace de descarga en nuestra JSP.
downloadPage.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Descarga de Archivos</h1>
<s:url id="fileDownload" namespace="/" action="download" ></s:url>
<h4>
Download file - <s:a href="%{fileDownload}">fileABC.txt</s:a>
</h4>
</body>
</html>

DownloadAction.java
import
import
import
import

java.io.File;
java.io.FileInputStream;
java.io.InputStream;
com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport{


private InputStream fileInputStream;
public InputStream getFileInputStream() {
return fileInputStream;
}
public String execute() throws Exception {
fileInputStream = new FileInputStream(new File("d:\\downloadfile.txt"));
return SUCCESS;
}
}

struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="">
<result name="success">downloadPage.jsp</result>
</action>
<action name="download" class="DownloadAction">
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">fileInputStream</param>
<param name="contentDisposition">attachment;filename="fileABC.txt"</param>
<param name="bufferSize">1024</param>
</result>
</action>
</package>
</struts>

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSch
ema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>downloadPage.jsp</welcome-file>
</welcome-file-list>
</web-app>

También podría gustarte