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

Generar un fichero desde un Blob

Estas en el tema de Generar un fichero desde un Blob en el foro de Java en Foros del Web. Hola chic@s, tengo un pequeño problemilla. Necesito descargar en un fichero lo almacenado en un campo Blob. A la hora de subirlo a la BBDD ...
  #1 (permalink)  
Antiguo 22/09/2010, 09:40
 
Fecha de Ingreso: septiembre-2010
Mensajes: 2
Antigüedad: 13 años, 7 meses
Puntos: 0
Generar un fichero desde un Blob

Hola chic@s,

tengo un pequeño problemilla.

Necesito descargar en un fichero lo almacenado en un campo Blob. A la hora de subirlo a la BBDD no tengo problema (se almacena de manera correcta). La dificultad viene a la hora de recuperarlo y que aparezca/salte la opción de "abrir", "guardar" o "cancelar" (el fichero)

el código que tengo es el siguiente:

Código:
public ActionForward descargaFichero(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		
		Long id=Long.parseLong(request.getParameter("id"));
		
		try{
			TTOL_Fichero_Solicitudes_Adsl adsl=adslDAO.findById(id);
			Blob blob=adsl.getFichero();
			InputStream stream=blob.getBinaryStream();
			ServletOutputStream fileOutputStream = response.getOutputStream();
			
			int length=-1;
			byte[] buffer= new byte[4096];
			
			while((length=stream.read(buffer))!=-1){
				fileOutputStream.write(buffer,0,length);
				fileOutputStream.flush();
			}
			response.setContentType("application/text");
			response.setHeader("Content-Disposition", "attachment;filename="+adsl.getNombreFichero());
		    response.setHeader("Pragma", "cache");
		    response.setHeader("Cache-control", "private, max-age=0");
		    stream.close();
		    fileOutputStream.close();
			
			return mapping.findForward(FWD_SUCCESS);
	        
		}
		catch(Exception e){
			logger.error("Error a la hora de generar el fichero de salida con id:"+id);
			logger.error(e.toString());
			return mapping.findForward(FWD_ERROR);
		}
	}

Resulta que no pregunta si quiero hacer una de las tres opciones anteriormente mencionadas, sino que lo abre directamente bloqueando el navegador. Y todo esto lo hace la primera vez, porque la siguiente directamente bloquea el navegador y el acrobat (dice que no encuentra el fichero).

En la BBDD guardo el nombre y la extensión del fichero que he subido, por lo que a la hora de bajarlo recupero el Blob como bytes, lo meto en un fichero y lo nombro con el nombre y extensión que ya tenía cuando lo subí. De esta manera si subí un .cvs debería de pedir abrir el excel y si subo un .pdf pediría abrir el abrobat (por ejemplo).

sabéis que puede estar fallando de mi código?

Muchísimas gracias de ante mano.
  #2 (permalink)  
Antiguo 22/09/2010, 10:33
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Generar un fichero desde un Blob

Usa este contentType (no está asociado con alguna aplicación como adobe reader por lo que el navegador te pedirá qué hacer).


Código Java:
Ver original
  1. response.setContentType("application/octet-stream");

Saludos!
  #3 (permalink)  
Antiguo 23/09/2010, 01:08
 
Fecha de Ingreso: septiembre-2010
Mensajes: 2
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Generar un fichero desde un Blob

Hola Hualro!!,

a parte de cambiar el request.setContentType, también había que cambiar las líneas de posición.

primero, antes de cargar el getOutputStream de datos, hay que cargar la request con los parámetros que indican cómo y qué quieres hacer con el fichero generado.

el código, para que funcione, tiene que quedar de la siguiente manera:

Código:
try{
TTOL_Fichero_Solicitudes_Adsl adsl=adslDAO.findById(id);
Blob blob=adsl.getFichero();
InputStream stream=blob.getBinaryStream();
ServletOutputStream fileOutputStream = response.getOutputStream();
			
int length=-1;
byte[] buffer= new byte[4096];
			

//response.setContentType("application/text");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="+adsl.getNombreFichero());
response.setHeader("Pragma", "cache");
response.setHeader("Cache-control", "private, max-age=0");
while((length=stream.read(buffer))!=-1){
  fileOutputStream.write(buffer,0,length);
  fileOutputStream.flush();
}
stream.close();
fileOutputStream.close();
			
return mapping.findForward(FWD_SUCCESS);
	        
}
catch(Exception e){

Mucha gracias por tu ayuda!!!!!

Etiquetas: blob, fichero, generar;
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 02:33.