2011-01-04 6 views
8

W moim @ActionMapping tworzę plik PDF dla użytkownika. Teraz zastanawiałem się, w jaki sposób mogę zwrócić ten plik pdf użytkownikowi w postaci okna dialogowego zapisu/otwierania pliku? Wolałbym to, pokazując link do pobrania, jeśli generowanie zakończyło się sukcesem.spring-mvc (portlet): jak zwrócić plik pdf w oknie dialogowym otwierania pliku?

Używam spring-mvc 3.0.5 w połączeniu z portletami. Ale jeśli ktoś ma jakieś wskazówki dla normalnej aplikacji, to prawdopodobnie mogę to ustalić. przez 2,0 Czytałem coś o rozszerzenie klasy pdfgenerator i twidling w web.xml, ale ponieważ w dzisiejszych czasach po prostu trzeba POJO na ....


Edit: kod po sugestii Adeel za:

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"; 

Odpowiedz

8

Możesz zapisać ten plik bezpośrednio na swojej response writer i nie zapomnij zmienić contentType. Na przykład,

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

Cóż, myślałem, że jego HttpServletResponse co masz, ale nie jest przypadek. Podczas pracy z portletem jego obiekt to RenderResponse. Po przeszukaniu przez Internet znalazłem kilka linków, które mogą ci się przydać w tym zakresie.

  • Pierwszy brać przykład Lotus Form Server Portlet, jego pokazując drogę, jak pozwalają na wielokrotne mime-type podczas konfigurowania portletu przy użyciu portlet.xml.

  • Oto Spring Portlet docs, pokazujący w jaki sposób konfigurujemy portlet za pomocą portlet.xml. Ma element XML o typie mime, zobacz czy możesz podać wartość, application/pdf, tam.

Innym pomysłem jest, aby zmienić parametr do ActionResponse response zamiast RenderResponse response. Jestem tu trochę rozmazany, nie jestem pewien, jaka jest twoja super klasa? jaka to metoda? etc ....

Wydaje mi się, że problem dotyczy dozwolonych/niedozwolonych typów MIME dla odpowiedzi portletu.

+0

dodać do Odpowiedź Adeela ... typ treści powinien być aplikacją/pdf – Mahesh

+0

@Mahesh: Właśnie to robiłem :). Dzięki i tak. –

+0

Właśnie wypróbowałem to i otrzymuję: application/pdf nie jest obsługiwanym mime/type. Ale wydaje się, że jest we właściwym kierunku. – jack

4

wiosną MVC, odpowiedź 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() jako zamiennik dla setHeader() w portletach - Dobrze wiedzieć, że to zadziała – fishbone

1

Oto odpowiedź po poradziłem sobie przez chwilę: Serve PDF in Spring Portlet MVC Architecture - Liferay 6.0.6

rozwiązaniem jest wykorzystanie zasobów Serving mechanizm z JSR 286. ResourceResponse res ma metodę res.setContentType("application/pdf");, dzięki czemu można jej używać do obsługi dowolnego rodzaju zasobów.Jeśli jest to potrzebne do pobrania jako załącznik, a następnie użyć tego:

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

0

Mój kod:

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

Ale gdzie jest pytanie? edytuj ... i dodaj je –

+0

lol - przepraszam - myślałem, że to było pytanie - jednak kilka słów wstępu byłoby miłych –