Método para disponibilizar um objeto do qual possa se obter uma binaryStream para download. Como um Blob, StreamedContent, etc.
public void exportFile(Blob binario, String filename) throws IOException {
HttpServletResponse response = (HttpServletResponse)
FacesContext.getCurrentInstance().getExternalContext().getResponse();
ServletOutputStream outStream = response.getOutputStream();
int b = 0;
BufferedInputStream is = null;
byte[] buf = null;
try {
is = new BufferedInputStream(binario.getBinaryStream());
response.setCharacterEncoding("ISO-8859-1");
response.setContentType("application/pdf"); // pode-se criar um metodo que retorne a ContentType dependendo da extensão do seu arquivo
response.setContentLength((int) binario.length());
System.out.println(binario.length());
response.addHeader("Content-Disposition", "inline; filename=\"" + filename + "\"");
response.addHeader("Cache-Control", "no-cache");
buf = new byte[8192];
while ((b = is.read(buf, 0, buf.length)) != -1) {
outStream.write(buf, 0, b);
}
is.close();
outStream.close();
res.getOutputStream().close();
FacesContext.getCurrentInstance().responseComplete();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
<p:commandButton action="#{documentoManagedBean.abreDocumento}" value="Abrir Documento"
ajax="false" onclick="form.target='_blank'"/>