Erro em upload de arquivo - Myfaces + Tomahawk + JSP + JSF

Pessoal, eu segui a risca esse tutorial mudando apenas a taglib do jar la para o tomahawk, mas ele lança a exceção abaixo:
Bean:

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

package br.com.ciakairos.arquivos;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.security.MessageDigest;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.apache.myfaces.custom.fileupload.UploadedFile;

/**
 *
 * @author samuel
 */
public class MyBean {

    private UploadedFile myFile;
    private String myParam;
    private String myResult;

    public UploadedFile getMyFile() {
        return myFile;
    }

    public void setMyFile(UploadedFile myFile) {
        this.myFile = myFile;
    }

    public String getMyParam() {
        return myParam;
    }

    public void setMyParam(String myParam) {
        this.myParam = myParam;
    }

    public String getMyResult() {
        return myResult;
    }

    public void setMyResult(String myResult) {
        this.myResult = myResult;
    }
    
    public String processMyFile() {
        try {
            MessageDigest md
                = MessageDigest.getInstance(myParam);
            InputStream in = new BufferedInputStream(
                myFile.getInputStream());
            try {
                byte[] buffer = new byte[64 * 1024];
                int count;
                while ((count = in.read(buffer)) > 0)
                    md.update(buffer, 0, count);
            } finally {
                in.close();
            }
            byte hash[] = md.digest();
            StringBuffer buf = new StringBuffer();
            for (int i = 0; i < hash.length; i++) {
                int b = hash[i] & 0xFF;
                int c = (b >> 4) & 0xF;
                c = c < 10 ? '0' + c : 'A' + c - 10;
                buf.append((char) c);
                c = b & 0xF;
                c = c < 10 ? '0' + c : 'A' + c - 10;
                buf.append((char) c);
            }

            myResult = buf.toString();
            return "OK";
        } catch (Exception x) {
            FacesMessage message = new FacesMessage(
                FacesMessage.SEVERITY_FATAL,
                x.getClass().getName(), x.getMessage());
            FacesContext.getCurrentInstance().addMessage(
                null, message);
            return null;
        }
    }

}

web.xml

...
     <!-- Extensions Filter -->
    <filter>
        <filter-name>extensionsFilter</filter-name>
        <filter-class>
            org.apache.myfaces.component.html.util.ExtensionsFilter
        </filter-class>
    <init-param>
        <param-name>uploadMaxFileSize</param-name>
        <param-value>50m</param-value>
        </init-param>
    <init-param>
        <param-name>uploadThresholdSize</param-name>
        <param-value>100k</param-value>
    </init-param>
    <init-param>
        <param-name>uploadRepositoryPath</param-name>
        <param-value>/home/samuel/kairos-files/</param-value>
        <description>Set the path where the intermediary files will be stored.
        </description>
    </init-param>
    </filter> 
    ...

JSF

<f:view>

<h:form id="MyForm" enctype="multipart/form-data" >

    <h:messages globalOnly="true" styleClass="message"/>

    <h:panelGrid columns="3" border="0" cellspacing="5">

        <h:outputLabel for="myFileId" value="File: "/>
        <x:inputFileUpload id="myFileId"
            value="#{myBean.myFile}"
            storage="file"
            required="true"/>
        <h:message for="myFileId"/>

        <h:outputLabel for="myParamId" value="Param: "/>
        <h:selectOneMenu id="myParamId"
                value="#{myBean.myParam}"
                required="true">
            <f:selectItem itemLabel="" itemValue=""/>
            <f:selectItem itemLabel="MD5" itemValue="MD5"/>
            <f:selectItem itemLabel="SHA-1" itemValue="SHA-1"/>
            <f:selectItem itemLabel="SHA-256" itemValue="SHA-256"/>
            <f:selectItem itemLabel="SHA-384" itemValue="SHA-384"/>
            <f:selectItem itemLabel="SHA-512" itemValue="SHA-512"/>
        </h:selectOneMenu>
        <h:message for="myParamId"/>

        <h:outputText value=" "/>
        <h:commandButton value="Submit"
            action="#{myBean.processMyFile}"/>
        <h:outputText value=" "/>

    </h:panelGrid>

</h:form>

</f:view>

A tal exceção:


15/02/2008 15:53:36 com.sun.faces.lifecycle.LifecycleImpl phase
WARNING: phase(RENDER_RESPONSE 6,com.sun.faces.context.FacesContextImpl@dc64a2) threw exception: java.lang.NoClassDefFoundError: Could not initialize class org.apache.myfaces.shared_tomahawk.config.MyfacesConfig Could not initialize class org.apache.myfaces.shared_tomahawk.config.MyfacesConfig
org.apache.myfaces.renderkit.html.util.ExtensionsPhaseListener.writeCodeBeforeBodyEnd(ExtensionsPhaseListener.java:129)
org.apache.myfaces.renderkit.html.util.ExtensionsPhaseListener.getCodeBeforeBodyEnd(ExtensionsPhaseListener.java:104)
org.apache.myfaces.renderkit.html.util.ExtensionsPhaseListener.getJavaScriptCodeAndStoreInRequest(ExtensionsPhaseListener.java:94)
org.apache.myfaces.renderkit.html.util.ExtensionsPhaseListener.afterPhase(ExtensionsPhaseListener.java:70)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:280)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Thread.java:619)

E sim, eu tenho todos o jars no meu classpath, a listar:

ant-1.6.5.jar                  commons-digester.jar               hibernate-validator.jar     jta.jar
ant-antlr-1.6.5.jar            commons-io-1.4.jar                 jaas.jar                    junit-3.8.1.jar
ant-junit-1.6.5.jar            commons-io-1.4-javadoc.jar         jacc-1_0-fr.jar             log4j-1.2.11.jar
ant-launcher-1.6.5.jar         commons-io-1.4-sources.jar         javassist.jar               mail.jar
antlr-2.7.6.jar                commons-logging-1.0.4.jar          jaxen-1.1-beta-7.jar        mysql-connector-java-5.1.5-bin.jar
ant-swing-1.6.5.jar            commons-logging.jar                jboss-archive-browsing.jar  oscache-2.1.jar
asm-attrs.jar                  concurrent-1.3.2.jar               jboss-cache.jar             proxool-0.8.3.jar
asm.jar                        connector.jar                      jboss-common.jar            standard.jar
c3p0-0.9.1.jar                 dom4j-1.6.1.jar                    jboss-jmx.jar               swarmcache-1.0rc2.jar
cglib-2.1.3.jar                ehcache-1.2.3.jar                  jboss-system.jar            syndiag2.jar
checkstyle-all.jar             ejb3-persistence.jar               jdbc2_0-stdext.jar          tomahawk-1.1.6.jar
cleanimports.jar               hibernate3.jar                     jgroups-2.2.8.jar           versioncheck.jar
commons-beanutils.jar          hibernate-annotations.jar          jsf-api.jar                 xerces-2.6.2.jar
commons-collections-2.1.1.jar  hibernate-commons-annotations.jar  jsf-impl.jar                xml-apis.jar
commons-collections.jar        hibernate-entitymanager.jar        jstl.jar

Alguém sabe pq isso naum ta funfando?
Muito obrigado

Galera, alguém ja conseguiu fazer upload de arquivo usando jsf + jsp?
De qualquer forma? Por favor, se alguem ja conseguiu, pode me dizer como?
Ja tentei varias formas, preciso de uma que funcione,
obrigado

comigo esta dando o mesmo problema tmb!

“java.lang.NoClassDefFoundError: Could not initialize class org.apache.myfaces.shared_tomahawk.config.MyfacesConfig”

eu preciso mt desse upload pra terminar o projeto!
eu tinha conceguido usando o Icefaces, mas ele é mt ruinzinhu, e resolvi usar o richfaces… mas o rich noa tem upload… entoa recorri ao tomahawk…
mas nao concigo colocar isso pra funcionar…

se alguem solber de algo…

grato

Mesmo problema… alguma solução?

Brother… eu desisti de usar o tomahawk !!!

vou esperar a novo richfaces 3.2
que vai ter o fileupload !

no site disse que vai sair esse mês!!

:smiley:

Eu consegui fazer com o upload do tomahawk, se alguem precisar de ajuda…

Quando saiu o richFaces 3.2 atualizei, e agora estou mudando o upload para o rich:fileUpload, MAS… logo quando eu tento grvar o arquivo em disco o método getData(), do UploadItem (do richFaces) retorna sempre null, ele pega o nome do arquivo belezinha, mas não faz o upload do “conteudo” do arquivo…

Alguém conseguiu fazer algo parecido ?

Até.

oi Eklam… pow vc conceguiu no tomahawk ::??

eu concegui no richfaces 3.2… qual seu problema lá ?

vc criou o listening ?

Então, usei sim, ele vai e chama tudo certinho, qnd eu tento grava em disco ele dava uma exceção, coloquei no upload:

public void upload(UploadEvent event) {
        System.out.println("132456" + event.getUploadItem().toString());
        System.out.println("132456" + event.getUploadItem().getFileName());
        System.out.println("132456" + event.getUploadItem().getData().length);
        getFiles().add(event.getUploadItem());
}

Os dois 1°s imprimem a informação certinho, mas o getData() retorna null… Posta o seu bean pra eu dar uma olhada, vc esta gravando o arquivo em disco ?

<h:form id="formUpload" enctype="multipart/form-data">
              <rich:fileUpload
                  align="center"
                  rendered="#{SessionUser.usuario.rules.atualizacao}"
                  acceptedTypes="txt, csv"
                  maxFilesQuantity="1"
                  listHeight="70"
                  uploadData="#{FileUploadBean.data}"
                  fileUploadListener="#{FileUploadBean.fileUploadListener}"
              />
          </h:form> 
private UploadItem data;

    public void setData(UploadItem data) {
        this.data = data;
    }

    public UploadItem getData() {
        return data;
    }

    public void fileUploadListener(org.richfaces.event.UploadEvent event) {

        System.out.println("listener: " + event.toString());
        UploadItem item = event.getUploadItem();

        System.out.println("listener: " + item.getFileName());

        File file = item.getFile();
        
        System.out.println("listener: " + file.getName());
        
    }

web.xml

<init-param> <param-name>createTempFiles</param-name> <param-value>true</param-value> </init-param>

espero que isso ajude

sim ele grava o arquivo em disco !
em uma pasta temporaria no servidor…

se quizer gravar em outro local
use o getUploadItem();

e escreve ele onde voce quizer

:smiley:

Então, até aí ta igual, (mas aqui o usuário pode fazer upload de vario de uma vez) quando eu dou um event.getUploadItem().getData(), que eu preciso pra salvar o arquivo no método que segue, ele retorna null e gera uma exceção…

método que grava em disco

    public synchronized String saveUploadedFile(UploadItem uploadedFile, String path) {
        String name = getFileName(uploadedFile.getFileName());
        String fullPath = caminhoC + path + name;
        FileOutputStream fos = null;
        try {
            File f = new File(fullPath);
            f.createNewFile();
            
            fos = new FileOutputStream(f);
            fos.write(uploadedFile.getData()); // <-- gera a exceção aqui ó . . .
            fos.close();
            return path + name;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

Se não for pedir muito, tenta dar um getData() aí no seu, pra ver se ele retorna alguma coisa…

brother… ele enviou os dois arquivos que eu mandei

C:\Documents and Settings\rbroz.netbeans\6.0\apache-tomcat-6.0.14_base\temp\67c40024-11934a531d9–7ffd58804.upload - 67c40024-11934a531d9–7ffd58804.upload
C:\Documents and Settings\rbroz.netbeans\6.0\apache-tomcat-6.0.14_base\temp\67c40024-11934a531d9–7ffc58805.upload - 67c40024-11934a531d9–7ffc58805.upload

ele salvou nesse diretorio…

ao invez de escrevelos…
nao é melhor ir la e copiar ele e coloar onde vc quer ?

file f = new file (“C:\Documents and Settings\rbroz.netbeans\6.0\apache-tomcat-6.0.14_base\temp\67c40024-11934a531d9–7ffc58805.upload - 67c40024-11934a531d9–7ffc58805.upload
”);

algo assim… seila

vc nao precisa usar o getdata. so pq vc ta uploading varios arquivos… pois quando ele termina um ele vai pro bean e faz o que tem que fazer…

ele nao envia todos arquivos de um vez pro bean…

ele faz o request de acordo com a qntidade de arquivo que vc tem…
entoa se voce fazer…

getUploadItem();

pegar o arquivo e salvar em outro lugar…
sera o primeiro arquivo que foi uploaded…

depois a app faz outro requeste para os outros arquivos :smiley:

É que eu tinha criado uma collection de arquivos, e colocava os arquivos la no fileUploadListener, e criei um método flush() que pegava todos os arquivos da collection e gravava em disco, mas eu acho q vou tentar criar um arquivo temporario e “copiar” ele em outro lugar, como vc sugeriu…

e que tipo… eu nao sei mais outra solução.
o richfaces ja cria os arquivos temporarios…

aquele .upload…

durante o request no listener

vc pega o nome do arquivo original.

e muda no arquivo temp. senao ele vai ficar com aquele nome grandao .upload

brother… como vc fez com o tomahawk ?
eu nao concegui implementar ele !
ele é compativel com jdk6, tomcat 6 , JSF 1.2 ?

Então, ta meio gambiarrado, mas é a ultima versão q eu tenho q ainda usa o do tomahawk…

Pagina

<x:inputFileUpload id="file" value="#{fonteSeguraMB.file}" storage="file" required="true"/>
<h:message id="fileMsg" for="file" />

O Bean

   private UploadedFile file;
   
    public UploadedFile getFile() {
        return file;
    }

    public void setFile(UploadedFile file) {
        this.file = file;
    }
    
    public boolean isCapaRendered() {
        System.out.println("isCapaRendered: " + getFonteSeguraSelecionada().getCapa() + "|");
        try {
            return ((getFonteSeguraSelecionada().getCapa() != null) && (!getFonteSeguraSelecionada().getCapa().trim().equals("")));
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }

    public String alterar() {
        UploadManager um = new UploadManager();
        String path = um.saveUploadedFile(getFile(), bd.getFonteSeguraLocal().fonteSeguraPath);
        getFonteSeguraSelecionada().setCapa(path);
        .
        .
        .
    }

A outra classe q salva o arquivo em disco

public class UploadManager {
    public String saveUploadedFile(UploadedFile uploadedFile, String path) {
        int i = uploadedFile.getName().lastIndexOf("\\") + 1;
        String name = uploadedFile.getName().substring(i);
        String fullPath = "C:\\..." + path + name; //<-provisorio para gravar o arquivo
        System.out.print("--->fullapth" + fullPath);
        FileOutputStream fos = null;
        try {
            File f = new File(fullPath);
            f.createNewFile();
            fos = new FileOutputStream(f);
            fos.write(uploadedFile.getBytes());
            fos.close();
            return path + name;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
}

Qq duvida posta ae…

PS: Aquele esquema de copiar o arquivo ainda n deu certo … rsrs

einda nao funcionou…

como esta seu web.XML ?

o exception:

java.lang.NoClassDefFoundError: Could not initialize class org.apache.myfaces.shared_tomahawk.config.MyfacesConfig

abs

O meu tava dando esse erro, se não me engano era biblioteca que estava faltando… ve se vc tem:

el-api-1.0.jar
el-impl-1.0.jar
commons-logging-1.1.1.jar
commons-el.jar
commons-io-1.4.jar
e as padrões… beanutils…collection…digester…

N lembro qual era…

web.xml - inteiro[code]

<?xml version="1.0" encoding="UTF-8"?> Mapfre Mapfre javax.faces.DEFAULT_SUFFIX .xhtml javax.faces.STATE_SAVING_METHOD client org.ajax4jsf.SKIN blueSky Ajax4jsf Filter ajax4jsf org.ajax4jsf.Filter ajax4jsf Faces Servlet REQUEST FORWARD INCLUDE ERROR org.jboss.web.jsf.integration.config.JBossJSFConfigureListener Faces Servlet javax.faces.webapp.FacesServlet 1 Faces Servlet *.jsf BASIC jsf-security-user-provider br.com.globalcode.jsf.security.usersession.SessionUserProvider Faces Servlet *.xhtml Sample members /teste.jsf GET POST admin admin supervisor protected pages ProtectedPages /teste.jsf GET POST HEAD PUT OPTIONS TRACE DELETE createTempFiles true [/code]

Sinistro, eu tenho todas essas libs…
sua version é 2.4
o meu é 2.5
nao é isso ?
seila rsrsrs

Certo, e como eu faço pra colocar esse arquivo temporário no diretório images da minha aplicação por exemplo???

Obrigado

Rodrigo