2011-01-04 53 views
8

En mi @ActionMapping creo un archivo PDF para el usuario. Ahora me preguntaba cómo puedo devolver este pdf al usuario en la forma de un cuadro de diálogo Guardar/Abrir archivo? Prefiero que esto muestre un enlace de descarga si la generación fue exitosa.spring-mvc (portlet): cómo devolver un archivo pdf en el cuadro de diálogo Abrir archivo?

Estoy usando spring-mvc 3.0.5 en combinación con portlets. Pero si alguien tiene algunos indicadores para una aplicación normal, entonces probablemente pueda resolverlo desde allí. Para 2.0 leí algo sobre la ampliación de una clase pdfgenerator y twidling en el web.xml, pero ya que hoy día sólo tenemos POJO de ....


Editar: Código después de la sugerencia de Adeel:

File file = new File("C:\\test.pdf"); 
     response.setContentType("application/pdf"); 

     try { 
      byte[] b = new byte[(int) file.length()]; 
      OutputStream out = response.getPortletOutputStream(); 
      out.write(new FileInputStream(file).read(b)); 
      out.flush(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return "users/main"; 

Respuesta

8

Puede escribir ese archivo directamente en su response writer, y no olvide cambiar el contentType. Por ejemplo,

response.setContentType("application/pdf"); 
response.setHeader("Content-Disposition", "attachment;filename=something.pdf"); 
OutputStream out = response.getOutputStream(); 
out.write(pdfFileContentInBytes); 
out.flush();     

Bueno, pensé que es un HttpServletResponse lo que tiene, pero no es el caso. Como está trabajando con Portlet, es un objeto RenderResponse. Después de buscar en Internet, encontré algunos enlaces que podrían ser útiles para usted en este sentido.

  • primero a tener un ejemplo de Lotus Form Server Portlet, la que muestra la manera cómo permitir múltiples de tipo MIME al configurar el portlet utilizando portlet.xml.

  • Aquí está Spring Portlet docs, muestra cómo configuramos el portlet usando portlet.xml. Tiene un elemento XML sobre mime-type, mira si puedes dar el valor application/pdf allí.

Otra idea es cambiar su parámetro para ActionResponse response, en lugar de RenderResponse response. Estoy un poco borroso aquí, no estoy seguro de cuál es tu súper clase? que método es? etc ....

Para mí, parece que el problema está permitido/no permitido en mime-types para la respuesta del portlet.

+0

a añadir a La respuesta de Adeel ... el tipo de contenido debería ser application/pdf – Mahesh

+0

@Mahesh: solo estaba haciendo eso :). Gracias de cualquier manera. –

+0

Acabo de probar eso y obtengo: application/pdf no es un mime/tipo compatible. Pero eso parece estar en la dirección correcta. – jack

4

en MVC primavera, la respuesta ResourceResponse

response.reset(); 
response.setContentType("application/pdf"); 
response.setProperty("Content-disposition", "attachment; filename=\"" +"example.pdf" +"\""); 

InputStream fontInputStream = request.getPortletSession() 
       .getPortletContext() 
       .getResourceAsStream("/WEB-INF/classes/arial.ttf"); 
Document document = new Document(PageSize.A4, 40, 40, 40, 50); 
PdfWriter writer = PdfWriter.getInstance(document, 
response.getPortletOutputStream()); 
document.addAuthor("XYZ"); 
document.addTitle("ASDF"); 
document.open(); 
+0

setProperty() como reemplazo de setHeader() en los portlets - Es bueno saber que esto funcionará – fishbone

1

Aquí está la respuesta después de que trabajé hacia fuera por un rato: Serve PDF in Spring Portlet MVC Architecture - Liferay 6.0.6

La solución es utilizar recursos Mecanismo Sirviendo de JSR 286. El ResourceResponse res tiene un método res.setContentType("application/pdf"); para que pueda usarlo para servir cualquier tipo de recursos.Si lo necesita para ser descargado como un archivo adjunto, a continuación, utilizar esto:

res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"attachment");

0

Mi código:

ResourceMapping ("GetPDF")

public void descargarRecibo(ResourceRequest request, 
     ResourceResponse response, PortletSession session, 
     ModelMap modelMap) { 
    FileInputStream fileInputStream = null; 
    BufferedInputStream bufferedInputStream = null; 

    String fileURL = "c:/intranetdoc/PDetalleLlamadas/file.pdf"; 

    try { 
     fileInputStream = new java.io.FileInputStream(fileURL); 
     OutputStream outputStream = response.getPortletOutputStream(); 
     response.setContentType("application/pdf"); 
     response.addProperty("Content-Disposition", "attachment; filename=" 
       + fileName); 
     bufferedInputStream = new java.io.BufferedInputStream(
       fileInputStream); 
     byte[] bytes = new byte[bufferedInputStream.available()]; 
     response.setContentLength(bytes.length); 
     int aByte = 0; 
     while ((aByte = bufferedInputStream.read()) != -1) { 
      outputStream.write(aByte); 
     } 
     outputStream.flush(); 
     bufferedInputStream.close(); 
     response.flushBuffer(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

¿Pero dónde está la pregunta? editar ... y agregarlo –

+0

jajaja - lo siento - pensó que era una pregunta - sin embargo algunas palabras de presentación serían agradables –

Cuestiones relacionadas