Richfaces: FileUpload - Ajuda

Pessoal, estou tentando fazer funcionar o componente fileUpload do richfaces. eu tentei fazer um programa pequeno, para fazer exatamente o que o demo esta fazendo (para quem nao conhece o demo da exadel: http://livedemo.exadel.com/richfaces-demo/richfaces/fileUpload.jsf;jsessionid=B65E3A0400B3CB6B2D4F989F01BB0F0C?c=fileUpload)

seguinte, o pragrama que eu fiz, nao esta adicionando nome e tamanho dos arquivos no panel.

ae vao os fontes:

FileBean.java

public class FileBean {

	private String Name;
	private long length;
	private byte[] data;
	public byte[] getData() {
		return data;
	}
	public void setData(byte[] data) {
		this.data = data;
	}
	public String getName() {
		return Name;
	}
	public void setName(String name) {
		Name = name;
	}
	public long getLength() {
		return length;
	}
	public void setLength(long length) {
		this.length = length;
	}
}

FileUploadBean.java

public class FileUploadBean{
	
	private ArrayList<FileBean> files = new ArrayList<FileBean>();
	private int uploadsAvailable = 5;
	private boolean autoUpload = false;
	public int getSize() {
		if (getFiles().size()>0){
			return getFiles().size();
		}else 
		{
			return 0;
		}
	}

	public FileUploadBean() {
	}

	public void paint(OutputStream stream, Object object) throws IOException {
		stream.write(getFiles().get((Integer)object).getData());
	}
	public void listener(UploadEvent event) throws Exception{
	    UploadItem item = event.getUploadItem();
	    FileBean file = new FileBean();
	    file.setLength(item.getData().length);
	    file.setName(item.getFileName());
	    file.setData(item.getData());
	    files.add(file);
	    uploadsAvailable--;
	}
	
	public String clearUploadData() {
		files.clear();
		setUploadsAvailable(5);
		return null;
	}
	
	public ArrayList<FileBean> getFiles() {
		return files;
	}

	public void setFiles(ArrayList<FileBean> files) { 
		this.files = files;
	}

	public int getUploadsAvailable() {
		return uploadsAvailable;
	}

	public void setUploadsAvailable(int uploadsAvailable) {
		this.uploadsAvailable = uploadsAvailable;
	}

	public boolean isAutoUpload() {
		return autoUpload;
	}

	public void setAutoUpload(boolean autoUpload) {
		this.autoUpload = autoUpload;
	}

}

faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="1.2" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
        
    <managed-bean>
        <managed-bean-name>bean</managed-bean-name>
        <managed-bean-class>br.gov.ce.seplag.upload.beans.Bean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    
    <managed-bean>
        <managed-bean-name>fileUploadBean</managed-bean-name>
        <managed-bean-class>br.gov.ce.seplag.upload.beans.FileUploadBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    
</faces-config>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    
    <!-- Nome de Display -->
    <display-name>Rich Faces</display-name>
    
    <!-- Listeners -->
    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>
    
    <!-- Parametros de Contexto -->
    <context-param>
        <param-name>facelets.REFRESH_PERIOD</param-name>
        <param-value>2</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.DEVELOPMENT</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.verifyObjects</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.validateXml</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.SKIN</param-name>
        <param-value>japanCherry</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
        <param-value>com.sun.facelets.FaceletViewHandler</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.COMPRESS_STYLE</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
        <param-value>NEKO, TIDY</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.CONTROL_SKINNING</param-name>
        <param-value>enable</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.LoadStyleStrategy</param-name>
        <param-value>ALL</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.LoadScriptStrategy</param-name>
        <param-value>ALL</param-value>
    </context-param>
    
    <!-- Filtros -->
    <filter>
        <display-name>RichFaces Filter</display-name>
        <filter-name>richfaces</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
        <init-param>
            <param-name>createTempFiles</param-name>
            <param-value>false</param-value>
        </init-param>
    </filter>
    
    <!-- Mapeamento dos Filtros -->
    <filter-mapping>
        <filter-name>richfaces</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    
    <!-- Faces Servlet -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <!-- Mapeamento dos Servlets -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    
    <!-- Configuracoes de Sessao -->
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    
    <!-- Configuracoes de Login -->
    <login-config>
        <auth-method>BASIC</auth-method>
    </login-config>
    
    <!-- Arquivo Inicial da Aplicacao -->
    <welcome-file-list>
        <welcome-file>redirect.jsp</welcome-file>
    </welcome-file-list>
</web-app>

redirect.jsp

<%@page pageEncoding="UTF-8"%>

<%--
    This file forwards to the entry of JavaServer Faces application.
    See <welcome-file-list> in web.xml file.
--%>

<jsp:forward page="content/pages/index.jsf"/>

index.jsp

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@taglib uri="http://richfaces.org/rich" prefix="rich"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>repeater </title>
    </head>
    <body>
        <f:view>
            <ui:composition xmlns="http://www.w3.org/1999/xhtml"
                            xmlns:ui="http://java.sun.com/jsf/facelets"
                            xmlns:h="http://java.sun.com/jsf/html"
                            xmlns:f="http://java.sun.com/jsf/core"
                            xmlns:a4j="http://richfaces.org/a4j"
                            xmlns:rich="http://richfaces.org/rich">
                <style>
                    .top {
                        vertical-align: top;
                        
                    }
                    .info {
                        height: 202px;
                        overflow: auto;
                    }
                </style>
                <h:form>
                    <h:panelGrid columns="2" columnClasses="top,top">
                        <rich:fileUpload fileUploadListener="#{fileUploadBean.listener}"
                                         maxFilesQuantity="#{fileUploadBean.uploadsAvailable}"
                                         id="upload"
                                         immediateUpload="#{fileUploadBean.autoUpload}"
                                         acceptedTypes="jpg, gif, png, bmp">
                            <a4j:support event="onuploadcomplete" reRender="info" />
                        </rich:fileUpload>
                        <h:panelGroup id="info">
                            <rich:panel bodyClass="info">
                                <f:facet name="header">
                                    <h:outputText value="Uploaded Files Info" />
                                </f:facet>
                                <h:outputText value="No files currently uploaded"
                                              rendered="#{fileUploadBean.size==0}" />
                                <rich:dataGrid columns="1" value="#{fileUploadBean.files}"
                                               var="file" rowKeyVar="row">
                                    <rich:panel>
                                        <h:panelGrid columns="2">
                                            <a4j:mediaOutput element="img" mimeType="image/jpeg"
                                                             createContent="#{fileUploadBean.paint}" value="#{row}"
                                                             style="width:100px; height:100px;" />
                                            <h:panelGrid columns="2">
                                                <h:outputText value="File Name:" />
                                                <h:outputText value="#{file.name}" />
                                                <h:outputText value="File Length(bytes):" />
                                                <h:outputText value="#{file.length}" />
                                            </h:panelGrid>
                                        </h:panelGrid>
                                    </rich:panel>
                                </rich:dataGrid>
                            </rich:panel>
                            <rich:spacer height="3"/>
                            <br />
                            <a4j:commandButton action="#{fileUploadBean.clearUploadData}"
                                               reRender="info, upload" value="Clear Uploaded Data"
                                               rendered="#{fileUploadBean.size>0}" />
                        </h:panelGroup>
                    </h:panelGrid>
                </h:form>
            </ui:composition>
        </f:view>
    </body>
</html>

eh isso, ele nao adiciona as informacoes do arquivo no panel, o que esta errado no codigo?

[]'s

Alguem tem uma ideia?

rapaz … que raiva … era soh o escopo do fileUploadBean que tava errado :confused: … mudei de request para session e funcionou

edit
agora que eu consegui botar o bicho para funcionar, queria saber o seguinte … essa pergunta, eu ate jah pesquisei no forum e tinha um cara com uma duvida igual a minha, mas ninguem respondeu o topico dele … vou refazer a pergunta entao.

tem como especificar um diretorio para a aplicacao salvar o arquivo? usando somente o richfaces
se nao. como vou fazer para salvar o arquivo no servidor?

Eu gostaria de saber onde ele salva os arquivos carregados…
:?:

Saca só esse metódo:

[code] private String recuperaDiretorioImagem() {
String newDiretory;
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
ServletContext ctx = (ServletContext)externalContext.getContext();
//seto onde vai ser o diretorio de img
newDiretory = ctx.getRealPath(“WEB-INF\img”);

	return newDiretory;
}[/code]

ele vai retornar o diretorio de onde esta rodando minha aplicação
dai pra vc salvar basta: fazer o seguinte

Date nomeMomento = new Date(); String nome = String.valueOf(nomeMomento.getTime()); UploadItem item = event.getUploadItem(); String fullPath = recuperaDiretorioImagem()+"\\"+nome+".jpg"; //minha imagem vai receber o nome do momento que estiver sendo gerada (isso nunca repete) File f = item.getFile(); f.renameTo(new File(fullPath));

Implementação : JSF (SUN-RI)1.2/Richfaces3.2/Eclipse/Hibernate3
Bom é isso que aprendi
quem tiver uma idéia melhor: por favor
ajude-nos
abração

Valeu JotaJota!

Irei testar assim que possível e depois lhe aviso o resultado.