Foros del Web » Programación para mayores de 30 ;) » Java »

Url a archivos de servidor desde el jsp

Estas en el tema de Url a archivos de servidor desde el jsp en el foro de Java en Foros del Web. Hola amigos, tengo una aplicación donde cargo archivos al servidor sin problema, y encontré una manera de tener un link para descargarlos, funciona bien, el ...
  #1 (permalink)  
Antiguo 10/01/2014, 12:15
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Pregunta Url a archivos de servidor desde el jsp

Hola amigos, tengo una aplicación donde cargo archivos al servidor sin problema, y encontré una manera de tener un link para descargarlos, funciona bien, el código es:

Desde el link:

Código HTML:
<a onclick="window.open('salida.jsp?arch=<%=ficheros[x]%>');" href="#"><%=ficheros[x]%></a><br> 
y el contenido de salida.jsp:

Código HTML:
try{
String nomFile = request.getParameter("arch");
FileInputStream archivo = new FileInputStream(request.getServletContext().getRealPath("/") + "archivos/"+nomFile);
int longitud = archivo.available();
byte[] datos = new byte[longitud];
archivo.read(datos);
archivo.close();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename="+nomFile);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(datos);
ouputStream.flush();
ouputStream.close();
}catch(Exception e){ e.printStackTrace(); } 
Lo que hace salida.jsp es que me permite descargar mis archivos del servidor, pero si intento descargar un video muy pesado, me manda el error:

Código HTML:
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.OutOfMemoryError: Java heap space
y puedo entender el porque, intenté hacer una liga directa al video para descargarlo y no me funciona:

Código HTML:
<A href="<%=request.getServletContext().getRealPath("/") + "archivos/El video.mp4"%>">El video.mp4</A> 
Pero no me funciona, alguien pudiera orientarme para hacerlo de otro modo? saludos y gracias de antemano!
__________________
Wow! No se que decir...
  #2 (permalink)  
Antiguo 10/01/2014, 13:14
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Url a archivos de servidor desde el jsp

Hola:

El problema está en q tratas de cargar el archivo completo en memoria antes de enviarlo al cliente:

Código Java:
Ver original
  1. byte[] datos = new byte[longitud];
  2. archivo.read(datos);

si el archivo es más grande q la memoria q tienes disponible es evidente q el programa va a dar un error:
Código Java:
Ver original 

La solución es crear un buffer intermedio y hacer la copia de poco a poco.
Código Java:
Ver original
  1. FileInputStream input = new FileInputStream(........)
  2. ServletOutputStream ouput = response.getOutputStream();
  3. byte[] buf = new byte[1024];
  4. int bytesRead;
  5. while ((bytesRead = input.read(buf)) > 0) {
  6. output.write(buf, 0, bytesRead);
  7. }

de esta forma solo tienes 1024 bytes en memoria en cada momento.

slds;

nup_


PD: Por cierto, quizás quieras ver esta página:
http://es.wikipedia.org/wiki/Directory_traversal
a no ser q tengas algún mecanismo de seguridad q no se muestre aquí, estás exponiendo todo tu sistema de ficheros a cualquier atacante q tenga acceso a tu página.
Para algunas soluciones:
https://www.securecoding.cert.org/co...alidating+them
http://stackoverflow.com/questions/2...aversal-attack

Última edición por nup_; 10/01/2014 a las 13:34
  #3 (permalink)  
Antiguo 10/01/2014, 14:41
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Url a archivos de servidor desde el jsp

Hola nup_, tu idea funcionó de marabilla, me quedó el código así!

Código HTML:
try{
String nomFile = request.getParameter("arch");
FileInputStream archivo = new FileInputStream(request.getServletContext().getRealPath("/") + "archivos/"+nomFile);
int longitud = archivo.available();
byte[] datos = new byte[1024];//error aquí
//archivo.read(datos);
//archivo.close();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename="+nomFile);
ServletOutputStream ouputStream = response.getOutputStream();
//byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = archivo.read(datos)) > 0) {
ouputStream.write(datos, 0, bytesRead);
}
archivo.close();
//ouputStream.write(datos);
ouputStream.flush();
ouputStream.close();
}catch(Exception e){ e.printStackTrace(); }    
Gracias de nuevo y saludos!
__________________
Wow! No se que decir...

Etiquetas: jsp
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:27.