PDA

Ver la versión completa : Como subir archivos al tomcat con struts



luis9rs
24-04-2010, 14:14
Hola! Estoy intentando subir archivos al tomcat desde mi proyecto usando el framework struts. Encontres un tutorial de como hacerlo, que me puedo ejecutar correctamente. El problema es, que en ningun momento te dicen como meterle la ruta donde lo quieres guardar y no encuentro ninguna funcion donde especificarlo. Mi codigo es el siguiente:
Tengo el siguiente Action de struts con su correspondiente form bean:

public class UploadAction extends org.apache.struts.action.Action {

/* forward name="success" path="" */
private static final String SUCCESS = "success";

/**
* This is the action called from the Struts framework.
* @param mapping The ActionMapping used to select this instance.
* @param form The optional ActionForm bean for this request.
* @param request The HTTP Request we are processing.
* @param response The HTTP Response we are processing.
* @throws java.lang.Exception
* @return
*/
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {




if (form instanceof UploadForm)
{

UploadForm formulario = (UploadForm) form;

FormFile fichero = formulario.getTheFile();
String contentType = fichero.getContentType();
String nombreFichero = fichero.getFileName();
int tamFichero = fichero.getFileSize();
byte[] datosFichero = fichero.getFileData();
System.out.println("Tipo: " + contentType);
System.out.println("Nombre: " + nombreFichero);
System.out.println("Tamano: " + tamFichero);

try {
//guarda los datos del fichero
ByteArrayOutputStream flujoSalida = new ByteArrayOutputStream();
InputStream flujoEntrada = fichero.getInputStream();
// solo si el archivo es de menos de 4MB
if (tamFichero < (4*1024000))
{
byte[] buffer = new byte[8192];
int bytesLeidos = 0;
while ((bytesLeidos = flujoEntrada.read(buffer, 0, 8192)) != -1)
{
flujoSalida.write(buffer, 0, bytesLeidos );

}

String datos = new String(flujoSalida.toByteArray());
}
else
{
String datos = new String("Fichero de más de 4MB: no pudo almacenarse." +
" Tamano del fichero: " + tamFichero + " bytes.");
}
}
catch(Exception e)
{}

}

return mapping.findForward(SUCCESS);
}
//RETURN NULL;
}
Y mi jsp es:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<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.do" enctype="multipart/form-data">
<p>Introduzca el nombre del fichero a subir:&nbsp;&nbsp;<br />
<html:file property="theFile" /></p>
<p><html:submit /></p>
</html:form>
</div>
</body>
</html>

Todo configurado correctamente mediante el struts-config.xml, ya que se ejecuta correctamente, solo que sin especificarle la ruta de destino.
¿Alguien sabe alguna forma de decirle en el action en que carpeta de tomcat quiero que se guarde?? O sabeis alguna otra forma de subir archivos al tomcat usando struts??
Gracias por anticipado. Salu2

luis9rs
16-07-2010, 23:35
La ruta del fichero se especifica en flujoSalida. Para almacenar el fichero en donde queramos, crearemos un fichero copia del anterior en la ruta que queramos. Para ello en lugar de ser flujoSalida un array:
ByteArrayOutputStream flujoSalida = new ByteArrayOutputStream();

Será un fichero de salida que creamos con el nombre que queramos:

FileOutputStream flujoSalida =
new FileOutputStream(new File("ruta/nombreficheronuevo.extension"));

Espero que si alguien tiene la misma duda que tuve yo, esto le sirva ;)

hystd
17-07-2010, 10:32
Hace tiempo tuve que hacer algo similar. La idea era copiar el fichero temporal creado en tomcat con el contenido del fichero mandado por el cliente, en la ruta que tu le especifiques. Es decir, el truco está en una simple rutina para copiar ficheros:

BufferedInputStream bufferIn = new BufferedInputStream (new FileInputStream(fichero));
BufferedOutputStream bufferOut = new BufferedOutputStream(new FileOutputStream("ruta//nombrefichero.ext"));
while (bufferIn.read(leidos, 0, 1024)>=0){ //lee de 1K en 1K
bufferOut.write(leidos, 0, 1024);
}

Bueno, sólo es otra alternativa, aunque un poco tarde, pues ya encontraste tu solución...

Un saludo.