2010-08-28 3 views

cevap

49

Eylem yönteminde, JS servo altından HTTP sunucu yanıtı ExternalContext#getResponse() tarafından edinilebilir. O zaman en azından application/pdf HTTP Content-Type başlık ve attachment HTTP Content-Disposition başlığını (eğer webbrowser ekranı kendisi halletsin istediğinizde) ya da inline için (eğer diyalog gibi bir Kaydet pop istediğinizde) ayarlamanız gerekir. Son olarak, IllegalStateException'un etrafta uçuşmasını önlemek için FacesContext#responseComplete() numaralı telefonu aramanız gerekir.

verici başlangıç ​​örnek: Bunun yerine bir byte[] daha bir InputStream olarak PDF içeriğini almak imkanı varsa, ben bellek domuz gelen web uygulamasını, kurtarmak için bunun yerine kullanmayı tavsiye ederim dedi

public void download() throws IOException { 
    // Prepare. 
    byte[] pdfData = getItSomehow(); 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); 

    // Initialize response. 
    response.reset(); // Some JSF component library or some Filter might have set some headers in the buffer beforehand. We want to get rid of them, else it may collide. 
    response.setContentType("application/pdf"); // Check http://www.iana.org/assignments/media-types for all types. Use if necessary ServletContext#getMimeType() for auto-detection based on filename. 
    response.setHeader("Content-disposition", "attachment; filename=\"name.pdf\""); // The Save As popup magic is done here. You can give it any filename you want, this only won't work in MSIE, it will use current request URL as filename instead. 

    // Write file to response. 
    OutputStream output = response.getOutputStream(); 
    output.write(pdfData); 
    output.close(); 

    // Inform JSF to not take the response in hands. 
    facesContext.responseComplete(); // Important! Else JSF will attempt to render the response which obviously will fail since it's already written with a file and closed. 
} 

. Daha sonra, her zamanki Java IO yolunu iyi bilinen InputStream - OutputStream döngüsüne yazarsınız.

+0

Çok teşekkürler :), oy veremiyorum (itibar). – marioosh

+0

Bu gönderi için teşekkür ederiz. –

+0

Sadece gerekenleri buldum. Teşekkür ederim. – user

5

MIME türünü yanıtınıza application/x-pdf olarak ayarlamanız yeterli. Servlet durumunda bunu yapmak için setContentType(String contentType) yöntemini kullanabilirsiniz. JSF olarak
/JSP size cevabı yazmadan önce bu, kullanabilirsiniz:

<%@ page contentType="application/x-pdf" %> 

ve response.write(yourPDFDataAsBytes()); verilerinizi yazmak için.
Ancak bu durumda servletleri kullanmanızı öneriyorum. JSF, PDF veya ikili dosyaları değil HTML görünümlerini oluşturmak için kullanılır. servlet ile

bu kullanabilirsiniz:

public MyPdfServlet extends HttpServlet { 
    protected doGet(HttpServletRequest req, HttpServletResponse resp){ 
     OutputStream os = resp.getOutputStream(); 
     resp.setContentType("Application/x-pdf"); 
     os.write(yourMethodToGetPdfAsByteArray()); 
    } 
} 

Kaynaklar:

+0

Küçük bir deneyimden tarayıcılar, uygulama/pdf'yi application/x-pdf'den daha iyi kullanır. –

1

JSF kullanarak tarayıcıya ham veri gönderirken, FacesContext'dan HttpServletResponse ürününü ayıklamanız gerekir.

HttpServletResponse'u kullanarak, standart IO API'yi kullanarak tarayıcıya ham veri gönderebilirsiniz. İşte

bir kod örneği: Ayrıca

public String getFile() { 
    byte[] pdfData = ... 

    FacesContext context = FacesContext.getCurrentInstance(); 
    HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); 
    OutputStream out = response.getOutputStream(); 
    // Send data to out (ie, out.write(pdfData)). 
} 

, burada düşünebilirsiniz diğer bazı şeyler şunlardır:

  • sen tarayıcıyı bilgilendirmek HttpServletResponse içerik türünü ayarlayın PDF verisi gönderiliyor: response.setContentType ("application/pdf");
  • Verileri, doğrudan bağlam.responseComplete() yöntemini kullanarak kullanıcıya gönderdiğiniz FacesContext'i bilgilendirin. Bu, JSF'nin gereksiz ek işlemler gerçekleştirmesini önler.