[RESOLVIDO] Stream Closed

Tenho que desenvolver uma lista, onde cada registro é um arquivo para download.
O problema que estou tendo é o seguinte, é possível fazer o download de cada arquivo apenas uma vez, a partir da segunda vez eu tenho uma exception… Alguém tem alguma idéia do que possa ser?

StackTrace:

java.io.IOException: Stream Closed at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(Unknown Source) at org.primefaces.component.filedownload.FileDownloadActionListener.processAction(FileDownloadActionListener.java:77) at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:813) at javax.faces.component.UICommand.broadcast(UICommand.java:300) at javax.faces.component.UIData.broadcast(UIData.java:1108) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

.xhtml:

<p:dataList value="#{convertePdfBean.listaPdfs}" var="arquivo" type="definition" styleClass="panelMedio"> <f:facet name="header"> Converter para PDF </f:facet> <h:commandLink value=" #{arquivo.name}"> <p:fileDownload value="#{convertePdfBean.pdf}" /> <f:param name="fileName" value="#{arquivo.name}"/> </h:commandLink> </p:dataList>

Bean:

[code]@ManagedBean
@ViewScoped
public class ConvertePdfBean implements Serializable{

private static final long serialVersionUID = -5979281879438861747L;

private List<StreamedContent> listaPdfs;
private StreamedContent pdf;

public ConvertePdfBean() {
listaPdfs = new ArrayList<StreamedContent>();
File f = new File("C:\\temp\\pdf");
final String extensao = ".pdf";

FilenameFilter filter = new FilenameFilter() {
    public boolean accept(File dir, String name) {
	name = name.toLowerCase();
	return name.endsWith(extensao);
    }
};

if (f != null) {
    InputStream is = null;
    for(File file :f.listFiles(filter)){
	try {
	    is = new FileInputStream(file.getAbsolutePath());
	} catch (FileNotFoundException e) {
	    e.printStackTrace();
	}
	StreamedContent arquivo = new DefaultStreamedContent(is, "application/pdf", file.getName());
	arquivo.getName();
	listaPdfs.add(arquivo);
    }
}

}

public List<StreamedContent> getListaPdfs(){
return listaPdfs;
}


public StreamedContent getPdf() {
String fileName = FacesContext.getCurrentInstance()
	.getExternalContext().getRequestParameterMap().get("fileName");

for (StreamedContent f : listaPdfs) {
    if (fileName != null && f.getName().equals(fileName)) {
	pdf = f;
    }
}

return pdf;
}

}[/code]

Bom, consegui resolver o problema fazendo a seguinte alteração no bean:

public ConvertePdfBean() {
	File f = new File("C:\\temp\\pdf");
	final String extensao = ".pdf";

	FilenameFilter filter = new FilenameFilter() {
	    public boolean accept(File dir, String name) {
		name = name.toLowerCase();
		return name.endsWith(extensao);
	    }
	};
	
	if (f != null) {
	    for(File file :f.listFiles(filter)){
		    //listaPdfs é do tipo File agora
            listaPdfs.add(file);
	    }
	}
    }

    public StreamedContent getPdf() {
	String fileName = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("fileName");
	InputStream is = null;
	for (File file : listaPdfs) {
	    if (fileName != null && file.getName().equals(fileName)) {
		try {
		    is = new FileInputStream(file.getAbsolutePath());
		} catch (FileNotFoundException e) {
		    e.printStackTrace();
		}
		StreamedContent arquivo = new DefaultStreamedContent(is, "application/pdf", fileName);
		arquivo.getName();
		pdf = arquivo;
	    }
	}

	return pdf;
    }
1 curtida