[RESOLVIDO]FileDownload Primefaces JSF

Galera não estou conseguindo aplicar o exemplo do <p:fileDownload /> do Primefaces, vejam o erro que está acontecendo:

Erro

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)

root cause

java.lang.NullPointerException
	org.primefaces.component.filedownload.FileDownloadActionListener.processAction(FileDownloadActionListener.java:53)
	javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:772)
	javax.faces.component.UICommand.broadcast(UICommand.java:300)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.14 logs.
Apache Tomcat/7.0.14

Meu index.xhtml

			<p:tab title="Controle">
				<h:panelGrid columns="2" cellpadding="5">
					<p:commandLink ajax="false" title="Download">
						<p:graphicImage value="/imagens/pdf.png" />
						<p:fileDownload value="#{documentacaoController.file}" />
					</p:commandLink>
					<h:outputText value="Arquivo" />
				</h:panelGrid>
			</p:tab>

Meu Controller

@ManagedBean
@SessionScoped
public class DocumentacaoController {

	private StreamedContent file;  
    
    public StreamedContent FileDocumentacaoController() {  
        InputStream stream = this.getClass().getResourceAsStream("C:/teste/CeWolf.pdf");  
        file = new DefaultStreamedContent(stream, "application/pdf", "downloaded_CeWolf.pdf");
        
        return file;
    }  
      
    public StreamedContent getFile() {  
        return file;  
    }  
  
    public void setFile(StreamedContent file) {  
        this.file = file;  
    }  
	
}

Alguém poderia me ajudar, pois estou batendo cabeça e não conseguigo solucionar o problema.

No console do eclipse ta dando esse erro:

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/documentacao] threw exception [null] with root cause
java.lang.NullPointerException
	at org.primefaces.component.filedownload.FileDownloadActionListener.processAction(FileDownloadActionListener.java:59)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:772)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

cara,

vc tem que fazer seu metodo getFile chamar o metodo FileDocumentacaoController, pq seu file ta null.

t+

Bom dia,

Apenas complementando o alissonvla, eu acho que o arquivo não está sendo localizado, veja se isso ajuda: getResourceAsStream.

[]'s

Veja se funciona:

[code]@ManagedBean
@SessionScoped
public class DocumentacaoController {

private StreamedContent file;

public DocumentacaoController() throws FileNotFoundException {
    InputStream stream = new FileInputStream("C:\\teste.txt");
    file = new DefaultStreamedContent(stream, "application/txt", "teste.txt");

    
}

public StreamedContent getFile() {
    return file;
}

public void setFile(StreamedContent file) {
    this.file = file;
}

} [/code]

[]'s

Fiz como getAdicted falou mais tbm não deu
E alterei como o alissonvla falou, mais continua dando o mesmo erro, veja como ficou:

Controller

public class FileDownloadController {

	private StreamedContent file;

	public StreamedContent getFile() throws FileNotFoundException {
		InputStream stream = new FileInputStream("C:\\arquivo.pdf");
		file = new DefaultStreamedContent(stream, "application/pdf", "arquivo.pdf");

		return file;
	}

	public void setFile(StreamedContent file) {
		this.file = file;
	}
}

index.xhtml

<h:form>

<p:commandButton value="Download" ajax="false">
	<p:fileDownload value="#{fileDownloadController.file}" />
</p:commandButton>

</h:form>

To apanhando muito para fazer algo que parece ser muito simples, será que estou esquecendo de configurar alguma coisa, pode ser algum bug? alguem tem algum modelo funcionando para me passar

Desde já agradeço

esqueci de colocar o erro

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/documentacao] threw exception [null] with root cause
java.lang.NullPointerException
	at org.primefaces.component.filedownload.FileDownloadActionListener.processAction(FileDownloadActionListener.java:53)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:772)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Já tentei debugar e nem entra no método do get!!!

Funciona sim, Diogão =D

Você precisa inicializar a variável de instância file no Construtor da classe, exatamente como eu fiz e como é mostrado no site do PF:

[code]@ManagedBean
@SessionScoped
public class DocumentacaoController {

private StreamedContent file;  

public DocumentacaoController() throws FileNotFoundException {  
    InputStream stream = new FileInputStream("C:\\teste.txt");  
    file = new DefaultStreamedContent(stream, "application/txt", "teste.txt");  

      
}  

public StreamedContent getFile() {  
    return file;  
}  

public void setFile(StreamedContent file) {  
    this.file = file;  
}  

}[/code]

[]'s

Grande "getAdicted "
Copiei esse seu último exemplo, funcionou perfeitamente, não sei no que eu tava apanhando, acho que aquele this.getClass().getResourceAsStream();
Não estava funcionando.

[quote=diogo soares]Grande "getAdicted "
Copiei esse seu último exemplo, funcionou perfeitamente, não sei no que eu tava apanhando, acho que aquele this.getClass().getResourceAsStream();
Não estava funcionando.[/quote]

Opa,

Coisa linda de deus!

Forte abraço!

olá pessoal preciso de uma ajuda

bom seguinte eu fiz o upload numa boa, ele guarda o arquivo num diretório e o caminho vai para o banco de dados, até ai normal
até fiz um teste para ver se mostra o caminho na tela e tudo legal

o problema é na hora do download aqui vai meus código aparte que interessa

<p:commandLink id="downloadLink" value="Download" ajax="false">  
                        <p:fileDownload value="#{documentoController.download()}" />  
                    </p:commandLink>

e o método de download tirei do show case do primefaces, tentei adaptar mas acho que não deu certo podem dar uma olhada

private StreamedContent file;

    public void download() {
        InputStream stream = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream(current.getCaminho());
        file = new DefaultStreamedContent(stream, current.getCaminho());
    }

    public StreamedContent getFile() {
        return file;
    }

ai da essa mensagem de erro:

java.lang.NullPointerException
- Stack Trace

java.lang.NullPointerException
	at org.primefaces.component.filedownload.FileDownloadActionListener.processAction(FileDownloadActionListener.java:53)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:772)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
	at java.lang.Thread.run(Thread.java:662)

poderiam me ajudar valeu!!!

bom podem ver que o current é um atributo que pega os get e set e manda para as telas e para a persistencia o getCaminho é o meu caminho que guardo no banco de dados
desculpa ali em cima é que deu alguns problemas
espero que alguém venha ver por causa do [RESOLVIDO]
mas se alguém quiser me ajudar

Oi amigo,

Em qual diretorio voce está tentando salvar o arquivo e qual IDE voce está utilizando?

[]'s

[quote=getAdicted]Oi amigo,

Em qual diretorio voce está tentando salvar o arquivo e qual IDE voce está utilizando?

[]'s[/quote]

oi amigo
Ok minha IDE é o NetBeans 7.1;
o diretório é : C:\home\ifrs\img
esse é o diretório onde estou salvando os arquivos do upload esse caminho e mais o nome e extensão do arquivo são salvos no banco de dados por exemplo: C:\home\ifrs\img\primefaces_users_guide_2_2.pdf

ai eu de teste resolvi mostrar o caminho em um &lt;h:outputText value="#{documentoController.selected.caminho}" /&gt;
pois é ele mostra legal
ai eu tentei fazer dele um link e obvio não deu certo, ai eu pensei em usar o componente do primefaces e segui vocês e não deu certo

pode me ajudar?

Oi,

Então, eu proponho você fazer o seguinte, grave o arquivo em um caminho relativo, por exemplo, a parte do download ficaria assim:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
*

  • @author HOUSE
    */
    @ManagedBean
    @SessionScoped
    public class Download {

    private StreamedContent file;

    public void setFile(StreamedContent file) {
    this.file = file;
    }

    public StreamedContent getFile() throws FileNotFoundException {
    String arquivo = “file.ext”;
    String caminho = FacesContext.getCurrentInstance().getExternalContext().getRealPath("") + “\” + arquivo;

     //log
     System.out.println("TESTEEEEEEEEEEE" + caminho);
    
     FileInputStream stream = new FileInputStream(caminho);
     file = new DefaultStreamedContent(stream, caminho);
     return file;
    

    }
    }
    [/code]
    … e assim:

&lt;p:commandLink id="downloadLink" value="Download" ajax="false"&gt; &lt;p:fileDownload value="#{download.file}" /&gt; &lt;/p:commandLink&gt;
… ao fazer o upload, voce carrega o arquivo para este mesmo diretório, no meu caso:

C:\Users\HOUSE\Documents\NetBeansProjects\ComponenteFileUploadJsfPrimefacesgravandoemdisco\build\web\

Tenta ai, qualquer coisa, avisa!

[]'s

e ai meu tentei fazer exatamente o que tu fez, ai tentei adaptar para a minha aplicação

private StreamedContent file;

    public void setFile(StreamedContent file) {
        this.file = file;
    }

    public StreamedContent getFile() throws FileNotFoundException {
        String arquivo = current.getCaminho();
        String caminho = FacesContext.getCurrentInstance().getExternalContext().getRealPath("") + "\\" + arquivo;

        //log  
        System.out.println("TESTEEEEEEEEEEE" + caminho);

        FileInputStream stream = new FileInputStream(caminho);
        file = new DefaultStreamedContent(stream, caminho);
        return file;
    }

pois é deu esse erro

C:\Documents and Settings\WinXP\Desktop\cadastroAjax\build\web\C:\home\ifrs\img\Vivos! - Pirataria.pdf (A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta)

estamos quase lá pelo menos ele pegou o caminho e parou de dar erro de nullo
quase lá mais uma e nó resolvemos
:smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley:

[quote=jaissonduarte]e ai meu tentei fazer exatamente o que tu fez, ai tentei adaptar para a minha aplicação

private StreamedContent file;

    public void setFile(StreamedContent file) {
        this.file = file;
    }

    public StreamedContent getFile() throws FileNotFoundException {
        String arquivo = current.getCaminho();
        String caminho = FacesContext.getCurrentInstance().getExternalContext().getRealPath("") + "\\" + arquivo;

        //log  
        System.out.println("TESTEEEEEEEEEEE" + caminho);

        FileInputStream stream = new FileInputStream(caminho);
        file = new DefaultStreamedContent(stream, caminho);
        return file;
    }

pois é deu esse erro

C:\Documents and Settings\WinXP\Desktop\cadastroAjax\build\web\C:\home\ifrs\img\Vivos! - Pirataria.pdf (A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta)

estamos quase lá pelo menos ele pegou o caminho e parou de dar erro de nullo
quase lá mais uma e nó resolvemos
:smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: [/quote]

Coloque o nome do arquivo nesse trecho: String arquivo = "nomeDoArquivo.jpg" … que vai funcionar!

[]'s

cara super nova

esta baixando o arquivo, que legal :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley:
pois é só que ele não esta pegando o nome do arquivo, estranho, quando eu baixo ele fica null.pdf
mas isso é só questão de pegar o nome e extensão do arquivo, mas acho que isso é só pegar da biblioteca io da uma olhada no código

private StreamedContent file;  
  
    public void setFile(StreamedContent file) {  
        this.file = file;  
    }  
  
    public StreamedContent getFile() throws FileNotFoundException {  
        //String arquivo = current.getCaminho();  
        //String caminho = FacesContext.getCurrentInstance().getExternalContext().getRealPath("") + "\\" + arquivo;  
  
        String caminho=current.getCaminho();
        //log  
        System.out.println("TESTEEEEEEEEEEE" + caminho);  
  
        FileInputStream stream = new FileInputStream(caminho);  
        file = new DefaultStreamedContent(stream, caminho); 
        System.out.println("chamando file: "+file);
        return file;  
    }  

pois é tive que comentar só para ver se funcionava, funciona
pena que baixa como null.pdf é só pegar o nome do arquivo
:smiley: :smiley: :smiley: :smiley: :smiley: :smiley: