[RESOLVIDO] Stream Closed

1 resposta
D

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:
@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;
    }

}

1 Resposta

D

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;
    }
Criado 24 de junho de 2014
Ultima resposta 24 de jun. de 2014
Respostas 1
Participantes 1