public String downloadDocumentoPDF(String caminhoArquivo) {
try {
File arquivoDownload = new File(caminhoArquivo);
byte[] arquivoBytes = ArquivoUtil.getBytesFromFile(arquivoDownload);
//caminhoArquivo = caminhoArquivo.substring(caminhoArquivo.lastIndexOf('/') + 1);
//HttpServletResponse response = (HttpServletResponse)extCtx.getResponse();
HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.setContentType("application/pdf");
//response.setContentType("application/octet-stream");
response.addHeader("Content-disposition", "attachment; filename=\"" + caminhoArquivo + "\"");
try {
ServletOutputStream os = response.getOutputStream();
os.write(arquivoBytes);
os.flush();
os.close();
FacesContext.getCurrentInstance().responseComplete();
//facesContext.responseComplete();
} catch(Exception e) {
addErrorMessageResource("erro.download.documento");
log.error("\nFailure : " + e.toString() + "\n");
return null;
}
} catch (Throwable th) {
addErrorMessageResource("erro.download.documento");
log.error("Erro executando download de PDF. ", th);
}
return null;
}
Download PDF
Pessoal já tentei de todas as formas, mas não deu certo. Quando vou gerar o meu pdf ele escreve no navegador um bocado de caracteres especiais, parece que ele tenta abrir o arquivo direto no navegador.
6 Respostas
Poxa velho, voce nao fez o download com o Seam? :lol:
Cara, confirme se o seu código que gera o array de bytes está ok. Fiz um teste aqui copiando e colando o seu codigo, exceto esse trecho que lê o arquivo e gera os bytes, e funcionou de boa.
O código que gera o array está correto. Inclusive já tentei com umas três formas diferentes achando que esse era o problema.
fiz esse metodo copiado e colado do seu, e funcionou. veja:
public void teste() throws Exception {
String fileName = "arquivo.pdf";
InputStream fileStream = resourceLoader.getResourceAsStream("pdf/" + fileName);
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int n = 0;
while ((n = fileStream.read(bytes, 0, bytes.length)) != -1) {
buffer.write(bytes, 0, n);
}
HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.setContentType("application/pdf");
response.addHeader("Content-disposition", "attachment; filename=\"" + fileName + "\"");
ServletOutputStream os = response.getOutputStream();
os.write(buffer.toByteArray());
os.flush();
os.close();
FacesContext.getCurrentInstance().responseComplete();
}
e na pagina,
<h:form>
<h:commandButton action="#{bean.teste}" value="Download" />
</h:form>
M
veja aki estou pegando o caminho onde ele esta salvo dentro de minha maquina que seria c:\arquivos.... estou usando primefaces
package br.com.projeto.controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import br.com.projeto.beans.Arquivos;
import br.com.projeto.dao.HibernateDao;
@SessionScoped
@ManagedBean
public class ArquivosBean implements Serializable{
private static final long serialVersionUID = 1L;
private Arquivos arquivo = new Arquivos();
private List<Arquivos> arquivos = new ArrayList<Arquivos>();
private StreamedContent file;
public String fileUploadAction(FileUploadEvent event) throws IOException {
try {
arquivo.setNome(event.getFile().getFileName());
byte[] conteudo = event.getFile().getContents();
String caminho = "C:\\arquivos\\" + event.getFile().getFileName();
FileOutputStream fos = new FileOutputStream(caminho);
fos.write(conteudo);
fos.close();
HibernateDao<Arquivos> hibernateDao = new HibernateDao<Arquivos>(Arquivos.class);
arquivo.setCaminho(caminho);
arquivo.setTamanho(conteudo.length);
String nomeArquivo = arquivo.getNome();
int e = nomeArquivo.lastIndexOf(".");
arquivo.setTipo(nomeArquivo.substring(e));
hibernateDao.salvar(arquivo);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Arquivo Salvo!", arquivo.getNome()));
} catch (Exception e) {
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, "Erro!", " " + e));
} finally {
arquivo = new Arquivos();
arquivos = new ArrayList<Arquivos>();
file = null;
}
return "Arquivos.xhtml";
}
public List<Arquivos> getListArquivos() {
HibernateDao<Arquivos> hibernateDao = new HibernateDao<Arquivos>(
Arquivos.class);
arquivos = hibernateDao.getBeans();
return arquivos;
}
public void remove() {
try {
HibernateDao<Arquivos> hibernateDao = new HibernateDao<Arquivos>(Arquivos.class);
Integer id = arquivo.getId();
arquivo = hibernateDao.getBean(id);
new File(arquivo.getCaminho()).delete();
hibernateDao.deletar(arquivo);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Arquivo Deletado!", arquivo.getNome()));
} catch (Exception e) {
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, "Erro!", " " + e));
} finally {
arquivo = new Arquivos();
arquivos = new ArrayList<Arquivos>();
file = null;
}
}
public StreamedContent getFile() throws FileNotFoundException {
HibernateDao<Arquivos> hibernateDao = new HibernateDao<Arquivos>(Arquivos.class);
Integer id = arquivo.getId();
arquivo = hibernateDao.getBean(id);
String caminho = arquivo.getCaminho();
FileInputStream stream = new FileInputStream(caminho);
System.out.println("akiii"+caminho);
return file = new DefaultStreamedContent(stream, caminho, arquivo.getNome());
}
public void setFile(StreamedContent file) {
this.file = file;
}
public Arquivos getArquivo() {
return arquivo;
}
public void setArquivo(Arquivos arquivo) {
this.arquivo = arquivo;
}
public List<Arquivos> getArquivos() {
return arquivos;
}
public void setArquivos(List<Arquivos> arquivos) {
this.arquivos = arquivos;
}
}
M
veh c voce tem o plugin para abrir pdf direto pelo navegador
Pode ser uma pergunta idiota talvez, mas que plugin é esse e onde encontro?
Criado 24 de janeiro de 2012
Ultima resposta 25 de jan. de 2012
Respostas 6
Participantes 3
Alura O que é Python? — um guia completo para iniciar nessa linguagem de programação Acesse agora o guia sobre Python e inicie sua jornada nessa linguagem de programação: o que é e para que serve, sua sintaxe e como iniciar nela!
Casa do Codigo Guia pratico de TypeScript: Melhore suas aplicacoes... Por Thiago da Silva Adriano — Casa do Codigo