2011-01-04 16 views
8

Nel mio @ActionMapping creo un file PDF per l'utente. Ora mi chiedevo come posso restituire questo pdf all'utente sotto forma di una finestra di dialogo salva/apri file? Preferirei che questo mostri un link per il download se la generazione ha avuto successo.spring-mvc (portlet): come restituire un file pdf nella finestra di dialogo dei file aperti?

Sto usando spring-mvc 3.0.5 in combinazione con i portlet. Ma se qualcuno ha qualche suggerimento per una normale applicazione, probabilmente potrei capirlo da lì. Per 2,0 ho letto qualcosa di estendere una classe pdfgenerator e twidling nel web.xml, ma dal momento che al giorno d'oggi abbiamo solo bisogno di POJO ....


Edit: codice dopo il suggerimento di 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"; 

risposta

8

È possibile scrivere il file direttamente su response writer e non dimenticare di modificare contentType. Ad esempio,

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

Beh, ho pensato che il suo un HttpServletResponse quello che hai, ma non è il caso. Poiché stai lavorando con Portlet, è un oggetto RenderResponse. Dopo aver cercato su Internet, ho trovato pochi collegamenti che potrebbero essere utili a voi in questo senso.

  • Prima fare un esempio di Lotus Form Server Portlet, sua mostra il modo per consentire a più tipo MIME durante la configurazione del portlet utilizzando portlet.xml.

  • Qui è Spring Portlet docs, mostrando come configuriamo il portlet utilizzando portlet.xml. Ha un elemento XML su mime-type, vedi se puoi dare il valore, application/pdf, lì.

Un'altra idea è quella di cambiare il parametro ActionResponse response, invece di RenderResponse response. Sono un po 'sfocato qui, non sono sicuro di quale sia la tua super classe? che metodo è? ecc ....

Per me, sembra che il problema sia consentito/non consentito mime-types per la risposta del portlet.

+0

da aggiungere La risposta di Adeel .. il tipo di contenuto dovrebbe essere application/pdf – Mahesh

+0

@Mahesh: lo stavo facendo :). Grazie comunque. –

+0

Ho appena provato e ottengo: application/pdf non è un mime/tipo supportato. Ma sembra essere nella giusta direzione. – jack

4

in MVC primavera, la risposta 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() in sostituzione di setHeader() nei portlet - Buono a sapersi che questo funzionerà – fishbone

1

Ecco la risposta dopo ho lavorato fuori per un po ': Serve PDF in Spring Portlet MVC Architecture - Liferay 6.0.6

La soluzione è quella di utilizzare risorse Meccanismo di servizio da JSR 286. Il ResourceResponse res ha un metodo res.setContentType("application/pdf"); così puoi usarlo per servire qualsiasi tipo di risorsa.Se avete bisogno di essere scaricato come allegato, quindi utilizzare questo:

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

0

Il mio codice:

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

Ma dov'è la domanda? modifica ... e aggiungilo –

+0

lol - scusa - pensavo che fosse una domanda - comunque alcune parole di introduzione sarebbero belle –

Problemi correlati