En este grupo En todos

Foro de Struts



Upload y download en struts

Iván
Cantabria, España
Escrito por Iván Quijano García
el 24/06/2007

Hola a todos,

Estoy con mi proyecto fin de carrera y quería incorporar a mi página en struts la posibilidad de subir documentos al servidor y de poder bajarlos, conseguí el tutorial de uploadstruts. Pdf de adictos al trabajo pero no me funciona, creo que esta mal hecho y ademas no pone nada de como recuperar despues esos archivos, para que alguien pueda bajarselos del servidor.

Gracias, espero podais ayudarme lo antes posible, no tengo mucho tiempo.
Ivan
Madrid, España
Escrito por Ivan
el 29/06/2007

Hola,

El api de struts solo te permite subir ficheros, no descargarlos. El manual del que hablas creo q esta bien, al menos yo lo seguí en su dia y me sirvió bastante.

Para descargar ficheros es mejor que te crees un servlet a parte y lo invoques cuando necesites desde un jsp por ejemplo, con un enlace.

En el servlet lo unico que tienes que hacer es obtener por ejemplo un array de bytes del fichero que quieres descargar. Crearte un objeto outputStream y volcar ahi el contenido, y meterlo todo en la response del servlet. Algo como esto:

                byte[] salida = //obtienes una array de bytes mediante un FileInputStream por ejempl;
               
                OutputStream outServlet = response. GetOutputStream();
                response. SetContentType(/*Aqui incluyes el tipo mime, por ejemplo application/pdf*/);
                //mediante esta linea conseguimos que no lo interprete el plugin del browser y nos de la opcion de guardar o
                //de abrirlo con el programa adecuado.

//metes las cabeceras en la peticion http
                response. SetHeader("Content-disposition",
                              "attachment; filename=" +
                              doc. GetNombreDocOriginal() );             
                outServlet. Write(salida);
                outServlet. Close();


Con este codigo tanto en el metodo get como en el metodo post de tu servlet podras descargar ficheros. Si no te funciona dimelo y te paso el servlet completo.

Un saludo.
Mercedes Bernal
Ingeniero en informática universidad c...
Escrito por Mercedes Bernal
el 05/08/2007

Buenas tardes.

Acabo de leer tu post, y es que estoy loca buscando como subir y descargar ficheros al/desde servidor.

¿Te importaría ayudarme? Es que estoy perdida en este tema. Te dejo mi correo merce_bernal-at-hotmail-punto-com

Muchas gracias de todas formas.

Un saludo

Mercedes Bernal
Ingeniero en informática universidad c...
Escrito por Mercedes Bernal
el 05/08/2007

Hola Iván.

Tengo el mismo problema, no consigo subir ficheros al servidor. He mirado el tutorial que comentas, pero tengo que abordarlo con Struts y no me funciona.

¿Te importaría comentarme cómo lo has solucionado? O algún sitio dónde te haya servido la información, es que no encuentro nada.

Muchas gracias.

Un saludo

Ivan
Madrid, España
Escrito por Ivan
el 06/08/2007

Hola,

Mirate este tutorial para subir ficheros al servidor con struts, es bastante bueno, aunq no sé si es el q has mirado:

Https://www.adictosaltrabajo.com/tutoriales/tutoriales. Php? Pagina=uploadstruts

Asegurate de poner en tu formulario de la jsp el atributo enctype que suele ser un olvido frecuente. Si no te funciona el ejemplo dime cual es el error que te da y lo miramos.

Para descargar archivos yo lo hago como comente arriba con un servlet, al cual invoco mediante un enlace en la jsp.

El codigo del servlet no tiene mas que lo que esta arriba, si no te funciona te paso el codigo completo.

Un saludo.


Mercedes Bernal
Ingeniero en informática universidad c...
Escrito por Mercedes Bernal
el 06/08/2007

Buenos días.

Muchísimas gracias por responder.

He estado mirando ese tutorial que me has dicho, pero no veo que guarde el contenido en ningún fichero. Si puedes decirme cómo lo haces tú o pasarme el código pues muchas gracias, es que no he trabajado antes con ficheros y estoy un poco perdida. He estado mirando para escribir en uno pero no termino de aclararme si tengo que usar un FileOutputStream o Buffer...

Muchas gracias de nuevo.

Un saludo

Ivan
Madrid, España
Escrito por Ivan
el 06/08/2007

Hola,

En el ejemplo guarda el contenido en un ByteArrayOutputStream pero tu puedes guardarlo en lo que quieras.

Del formfile puedes obtener un array de bytes o un inputStream y con eso puedes guardarlo en lo que quieras.

Yo normalmente lo que hago es obtener un InputStream y luego crearme un FileOutputSream e ir escribiendo en el:

FormFile f = formulario. GetFile();

InputStream is = f. GetInputStream();

FileOutputStream os = new FileOutputStream(new File(/*Nombre del fichero donde lo quieras guardar*/));

Int bytesRead = 0;
byte[] buffer = new byte[8192];
while (bytesRead = is. Read(buffer, 0, 8192))! = -1) {
      os. Write(buffer, 0, bytesRead);
}

Os. Close();


Y asi conseguiras tener tu fichero subido en un fichero de tu servidor.

Espero que te sirva.

Un saludo.

Mercedes Bernal
Ingeniero en informática universidad c...
Escrito por Mercedes Bernal
el 06/08/2007

Muchas gracias de nuevo.

Justamente estaba probando eso mismo, lo único que a mí se me había olvidado cerrarlo, pero ya lo he añadido!.

Pero ahora  ¿Cómo se yo ahora si me lo ha subido correctamente? Es que no encuentro el fichero.

Lo siento por molestarte de nuevo

Un saludo

Ivan
Madrid, España
Escrito por Ivan
el 06/08/2007

Hola,

Si no has puesto ruta en el nombre del fichero se te habra guardado en la carpeta de raiz de tu proyecto. Seguramente estara alli.

Un saludo.

Mercedes Bernal
Ingeniero en informática universidad c...
Escrito por Mercedes Bernal
el 06/08/2007

Hola de nuevo.

Siento molestar tanto, pero no se me terminan las dudas. Lo siento!

Lo que quería preguntar ahora, es que si intento subir un fichero mayor de 4mb como está configurado en el struts-config. Xml me salta una excepción de que el action no tiene el parámetro, y evidentemente claro que lo tiene, pues el código es el mismo que cuando es inferior a 4mb.

¿Puedo quitar la configuracion esa del struts-config. Xml y en el action si el tamaño es menor mostrar un mensaje de error? Es que así no tengo el problema este.

Otra cosa, sigo sin encontrar los archivos que se suben.

Gracias

Un saludo

Ivan
Madrid, España
Escrito por Ivan
el 07/08/2007

Hola,

En tu struts-config tendras una linea parecida a esta:

<controller maxFileSize="4M" inputForward="true"/>


Donde estás limitando el tamaño del archivo a subir, si la quitas, quitas dicha limitación. El inputForward indica si quieres que tu formulario coja el input que tienes declarado en el action.

Si quieres evitarte problemas con los tamaños es mejor que quites la linea y no limites nada. Mas adelante cuando hayas visto que funciona puedes probar a limitar los tamaños, pero es algo que tambien deberas comprobar en tu action.

Con respecto a los archivos que no los encuentras, puedes ponerme como creas el objeto File, para ver la ruta que pones.

Un saludo.

Mercedes Bernal
Ingeniero en informática universidad c...
Escrito por Mercedes Bernal
el 07/08/2007

Hola, si tenía esa línea exactamente. Vale de momento la quito.

El fichero lo creaba así:

File = new File(filename);

Al final lo que hice fue buscar con la función de búsqueda del ordenador y estaban en C-Archivos de Programa-ApacheSofwareFoundation-Tomcat 5. 5-bin

Lo que he hecho ahora es poner:

File fichero = new File(".. /webapps/StrutsPracticaFinal/files/"+fileName);

Para que se me coloquen en esa carpeta. Pero una cosa que te quiero preguntar, es que yo luego si tengo que subir mi aplicación a otro servidor de otro ordenador tendré que cambiarlo, y claro yo no quisiera cambiarlo, ¿Qué ruta podría ponerle para luego no tener que cambiarlo? Me han comentado algo de fichero de configuración, pero es que lo veo un poco complicado, ¿Me puedes aconsejar algo?

Muchas gracias de nuevo

Un saludo

Ivan
Madrid, España
Escrito por Ivan
el 08/08/2007

Hola,

Si la carpeta raiz de tu aplicación es StrutsPracticaFinal, y tienes dentro la carpeta files, poniendo rutas relativas deberia bastarte.

Tienes la opcion de si esto lo haces en un action, tienes el objeto ActionConfig y el metodo path() que te devuelve el path de la aplicacion, es decir la carpeta StrutsPracticaFinal (siendo esta la raiz del contexto).

Tambien tienes la opcion del fichero de configuracion. Hace tiempo pregunte esto a hugo, te pongo el link del post para q le eches un ojo:

Https://foros.emagister.com/tema-ficheros_de_configuracion_properties-43244-412628. Htm


Lo q no entiendo es donde tienes la clase donde creas el objeto file para tener que subir una carpeta y entrar en webapps, quiero decir no tendrias que subir nunca a esa carpeta, porque tus. Class deberian estar ya dentro de webapps y dentro de la carpeta raiz de tu aplicacion.

Bueno espero haberme explicado algo. Un saludo.

Mercedes Bernal
Ingeniero en informática universidad c...
Escrito por Mercedes Bernal
el 08/08/2007

En efecto, StrutsPracticaFinal es la carpeta raíz.

La clase que me crea el objeto file es un action. Puse esa ruta, porque si no le ponía ninguna me subía los ficheros a la carpeta bin del Tomcat.

Voy a documentarme haber como es eso del path.

Muchas gracias

Un saludo

Escrito por Hugo Rolón
el 30/08/2007
Hola Ivan... Muy amable como siempre y aprovechando de tu amabilidad queria pedirte el servlet completo para hacer el dowload... El upload me funciona sin problema. Te agradeceria un monton... ;) saludole atentamente...
Adelmo Martinez
Analisis de sistemas ucla- barquisimeto
Escrito por Adelmo Martinez
el 03/05/2008

Saludos voy a probar el codigo que me enviaste gracias estamos en contacto dame tu msn si pudes soy de venezuela

Alfaquino
Perú, Perú
Escrito por Alfaquino
el 23/05/2008

Por favor podrías pasarme el código completo para bajar archivos con un servlet por que ya logré subirlos, te agradecería mi correo es alfaquino@hotmail. Com

Alfaquino
Perú, Perú
Escrito por Alfaquino
el 23/05/2008
Alguien podría pasarme el código completo del servlet para descargar archivos
Se lo voy a agradecer mucho mi correo es alfaquino@hotmail. Com
por alfaquino (Mayo 2008)




Escrito por Asile
el 03/06/2008
"
Alguien podría pasarme el código completo del servlet para descargar archivos
Se lo voy a agradecer mucho mi correo es alfaquino@hotmail. Com
por alfaquino (Mayo 2008)




"

por alfaquino (Mayo 2008)



aprovechando este tema, tengo un problema. He seguido el tutoria de adictosaltrabajo. Com y va perfectamente. Subo la foto a mi servidor. El problema viene que yo tengo un formulario de alta de un producto. Tengo campos como el nombre el precio y la foto. Al darlo de alta lo guardo en la base de datos pero tambien quiero que la foto se guarde en el servidor, pero no lo consigo, he probado mil formas  como por ejemplo poner dos botones en el formulario (usando LookDispacthAction) para subir la foto antes de añadir el producto

Y nada me estoy volviendo loca, por favor alguien sabe la solucion?

Muchas gracias

Ivan
Madrid, España
Escrito por Ivan
el 04/06/2008

Hola a todos, el servlet completo es este, aunque no aporta mucho más de lo que ya escribí en su dia:


public class ServletObtenerDocumento extends javax.servlet.http. HttpServlet implements javax.servlet.Servlet {


   
    public ServletObtenerDocumento() {
        super();
    }     
  
  
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        process(request,response);
    }    
  
  
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        process(request,response);
    } 
  
    public void process(HttpServletRequest request, HttpServletResponse response) {
      

        ServletContext context = getServletContext();
      
        try{

                //Aqui obtenemos el fichero del disco duro de nuestro servidor o de base de datos

                //En cada caso lo obtendreis de una manera pero teneis que obtenerlo como un array de bytes

                //os pongo un ejemplo de como obtenerlo

                File archivo = new File (_rutaFichero_);
           
                String sLongitud = String. ValueOf(archivo. Length());
                byte[] bytes = new byte[Integer. ParseInt(sLongitud)]
           
               FileInputStream fostream = new FileInputStream(archivo);
           
                fostream. Read(bytes);



              
              
                OutputStream outServlet = response. GetOutputStream();

                //Si le añadis el tipo del fichero el navegador lo abrirá con el programa adecuado, por ejemplo un power point
                response. SetContentType("application/mspowerpoint");
                response. SetHeader("Content-disposition",
                                    "attachment; filename=_AQUI PONEIS EL NOMBRE DEL FICHERO QUE QUERAIS_");


                outServlet. Write(bytes);
                outServlet. Close();
              
              
            }
        }
        catch (Exception e){
            e. PrintStackTrace();
            System.out.println(e. GetMessage());
        }
    }
  
  
}