2010-05-26 6 views

cevap

33

kullanın. Bu Farklı Kaydet Kaydet diyalog açılır. Bunu HttpServletResponse#setHeader() kullanarak yapabilirsiniz. HTTP sunucu yanıtını JSF başlıklarının altından ExternalContext#getResponse() ile edinebilirsiniz.

JSF bağlamında, IllegalStateException'un etrafta uçuşmasını önlemek için yalnızca FacesContext#responseComplete() numaralı telefonu aradığınızdan emin olmanız gerekir.

verici başlangıç ​​örneği:

public void download() throws IOException { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); 

    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/xml"); // 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.xml\""); // 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. 

    BufferedInputStream input = null; 
    BufferedOutputStream output = null; 

    try { 
     input = new BufferedInputStream(getYourXmlAsInputStream()); 
     output = new BufferedOutputStream(response.getOutputStream()); 

     byte[] buffer = new byte[10240]; 
     for (int length; (length = input.read(buffer)) > 0;) { 
      output.write(buffer, 0, length); 
     } 
    } finally { 
     close(output); 
     close(input); 
    } 

    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. 
} 
+0

gerçekten çok teşekkürler. Kodu koydum ve şimdi, bağlantıyı tıklattığımda (FF) tarayıcısı, geçerli sayfayı bir indirme penceresi açmak yerine dosya içeriklerini içeren bir sayfa ile değiştirir. Ne yanlış yapabilirim? – volvox

+1

Başka bir tarayıcıda (IE, Chrome) deneyin veya FF'yi temiz bir profille yeniden başlatın. Bir web tarayıcısı XML dosyaları için varsayılan uygulama olarak yapılandırılmış olabilir ve XML dosyaları indirildiğinde otomatik olarak açılmalıdır. – BalusC

+1

Oh, ayrıca bunun asenkronize (ajaxical) bir istek olmadığından emin olun, ancak sadece bir senkron ("düz vanilya") isteği. Yani sadece "h: commandLink" veya "h: commandButton" işlevlerini kullanın, ancak RichFaces, Ajax4jsf, IceFaces, vs. ajaxical-powered 'UICommand' bileşenlerini kullanmayın. – BalusC

3

content-disposition: attachment HTTP başlığı attachment HTTP Content-Disposition başlığını ayarlama

0

bazen yazar kapatmadan önce response.getWriter().flush(); arayarak müşteriye içeriğini göndermek için yazar zorlamak gerekir. Bu benim durumumda kaydetme olarak açılır pencereyi açtı.

+1

Bu, yalnızca istek yanıtı zincirinde bozuk bir özel yazarı döndüren özel bir "HttpServletResponseWrapper" uygulaması varsa gerekli olur. Standart Servlet ve JSF uygulamaları için bu kesinlikle gerekli değildir. Çözüm, bu sarıcı/yazıcı uygulamasının düzeltilmesi ve yazıcının kodun her yerinden el ile temizlenmemesi olmalıdır. – BalusC

İlgili konular