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.