Download PDF

6 respostas
rafaelrodrigues1607
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.
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;
	}

6 Respostas

alias

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.

rafaelrodrigues1607

O código que gera o array está correto. Inclusive já tentei com umas três formas diferentes achando que esse era o problema.

alias

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

rafaelrodrigues1607

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