Problemas com multipart/form-data + FileUpload

Olá Pessoal!
Tenho um arquivo jsp que contém um form com dados de texto e um input html de arquivo (foto do usuário). Com os dados preenchidos (inclusive foto) eu passo esse form para o servlet que faz o upload de imagem e salva os dados do usuário.

para notificar o servlet do que ele deve fazer eu coloquei dentro do form a seguinte tag:

<form action="SrvCadastrarUsuario" method="post" name="alterar_dados" class="formulario1"> <input type="hidden" name="casoUso" value="alterarDados">

logo, dentro do servlet eu pego o tipo de caso de uso passado:

String casoUso = request.getParameter("casoUso");         

Depois eu vejo o valor da variável casoUso e em seguida processo a foto…o problema é q eu tive uma exceção lançada pelo FileUpload que requisitava um enctype=“multipart/form-data” ou enctype=“multipart/mixed stream”, aí que veio outro e mais enigmático problema:
quando eu colo isso (multipart…) na tag form dentro do arquivo jsp o input hidden (que contém o comando para o servlet executar o caso de uso) parece que não é passada junto com o form ou seja quando eu tento:

String casoUso = request.getParameter("casoUso");
if (casoUso.endsWith("alterarDados")) {
   (...)
}       

dá um NullPointerException, pois a variável casoUso == null…

alguém já se deparou com isso???
eu pesquisei no fórum mas não achei solução que não viesse por frameworks, como Struts ou webwork e nesse caso eu não estou usando nenhum framework…

detalhes: já coloquei o contenType do servlet para multipart tb mas não funcionou…

agradeço desde já!

É cara!!!
O melhor a fazer é usar um framework mesmo!
Pega o JSF ou o Struts mesmo!
Pelo menos com o codigo é aberto vc poderá ver e entender o que esta rolando!

Pode crê Anderson…
mas aí eu tenho um problema, pois o intuito desse trabalho era justamente não usar nenhum framework…
e agora?
jeito eu sei que existe…o problema é se alguém aqui ja resolveu né…

mas brigadaum do mesmo jeito!

eu nao se como fazer utilizando o fileupload, mas se quiseres digo como se faz xo mo jspsmartupload, envia-me um email para aft@sapo.pt

Salve,

bem você tem que colocar enctype=‘multipart/form-data’ no teu jsp e se você estiver utilizando commons file upload da apache faça o seguinte:

DiskFileUpload fu = new DiskFileUpload(); List fileItems = fu.parseRequest(request); Iterator i = fileItems.iterator(); while ( i.hasNext() ) { FileItem fi = (FileItem)i.next(); if ( fi.isFormField() ) suaVariável = fi.getString(); else{ try { InputStream in = fi.getInputStream(); // Obtém nome do arquivo String nomeArquivo = fi.getName(); // valor do atributo filename int nom = nomeArquivo.lastIndexOf( "\\" ); // busca somente o nome do arquivo nomeArquivo = nomeArquivo.substring( nom + 1 ); // salva o arquivo em File file = new File( caminho + "\\" + nomeArquivo + ""); // obtém conteúdo do arquivo FileOutputStream fos = new FileOutputStream(file); int c; while((c = in.read()) != -1) // lê linha a linha do arquivo fos.write(c); // grava linha por linha fos.close(); } catch ( Exception e ){} } }

Testei não, mas se contiver erros é bom que você aprende a lidar com o upload. Caso você não consiga resolver post novamente.

:okok:

Opa Marcos!
Cara…eu já havia tentado colocar o enctype=“multipart/form-data” juntamente com o código de upload de arquivo usando o FileUpload, mas não dedu certo… veja que o meu problema é que quando eu coloco o enctype=“multipart/form-data” ele não passa o input que vem logo abaixo que vai dar o comando de upload de arquivo para o servlet…

valeu!

opa,

Faz o seguinte coloca aí o código que você fez para o teu servlet.

:okok:

Aí vai o código do servlet:

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        
        //Faz o controle de sessao
        HttpSession sessaoHTTP = request.getSession(true);
        Usuario usuario = (Usuario)sessaoHTTP.getAttribute("usuario");
        if (usuario == null){
            response.sendRedirect("utilitario/mensagem_erro.jsp?mensagem="+"Sua sessão expirou!"+"&destino="+"/nucleo/login.htm");
        }
        // Execucao normal do Servlet
        else{
            // Obtem o caso de uso
            String casoUso = request.getParameter("casoUso");                        
                        
            // Evento Alterar Dados Gerais do Usuário
            if (casoUso.equals("alterarDados")){
                String nome, email, sexo, homePage;
                
                //Obtem os parametros
                nome = request.getParameter("nome");
                email = request.getParameter("email");
                sexo = request.getParameter("sexo");
                homePage = request.getParameter("homePage");
                
                //processando o arquivo de imagem:
                try{
                    DiskFileUpload dskFileUpload = new DiskFileUpload();
                    dskFileUpload.setSizeMax(262144); //tamanho máximo de 256k
                    dskFileUpload.setRepositoryPath("/tmp/");
                    
                    List fileItems = dskFileUpload.parseRequest(request);
                    Iterator iter  = fileItems.iterator();
                    FileItem fileItem = (FileItem)iter.next();
                    String fileName = fileItem.getName();
                    System.out.println("Nome do Arquivo: "+fileName);
                    fileItem.write(new File("/tmp/tmpImages/"+fileName));
                    System.out.println("mandou pro repositório!");
                    
                }catch(Exception e){
                    e.printStackTrace();
                    System.out.println("PAAAU nop Upload de Arquivo!");
                }
     //(...) salva o usuario
     }

e agora o código do jsp:

        <form action="SrvCadastrarUsuario" method="post" name="alterar_dados" class="formulario1" enctype = "multipart/form-data">
          
            <input type="hidden" name="casoUso" value="alterarDados">     
        (...)
        </form>

Poisé galera, o que acontece é que os parâmetros lidos no servlet vem nulos quando eu coloco o enctype=“multipart/form-data”…

já vi algo parecido em
http://www.jguru.com/faq/view.jsp?EID=1045507
onde o cara perguntava como ler parametros de um form com multipart/form-data (em inglês!)
lá tem a resposta… um sujeito disse para usar um tal de MultipartStream já que estou usando o FileUpload da Jakarta…mas tentei usar e não consegui…o construtor pede um inputStream e um vetyor de bytes…
imagino que haja outra solução…

valew pelas resposta!

Salve,

O problema é o seguinte, usando a propriedade multipart/form-data do formulário você tem que ler os dados de forma diferenciada, porque os campos do formulário não são tratados mais como parâmetros. Você vai obter o valor dos dados como eu mandei no primeiro post.

request.getParamete(“seucampo”); não funciona ok?

:okok:

Valeu Marcos!
Valeu Galera!
tá funcionando aqui!

brigadaum mesmo!

awee galera…
estou precisando de ajuda…
estou desenvolvendo uma aplicação com upload…e estou com problemas…como vi q vc jah conseguiu desenvolver talvez possa me ajudar…utilizo struts, eclipse, jboss…
o erro q esta ocorrendo é o seguinte:

procurei aqui no forum sobre o erro, pareçe q é alguma coisa relacionada a classpath, arquivo .jar…
porem jah adicionei o arquivo .jar na pasta web-inf/lib, declarei ele no meu projeto dentro do eclipse e o erro persistiu…
´

alguem poderia me dar uma ajuda mais detalhada do q fazer??

awee galera…
estou precisando de ajuda…
estou desenvolvendo uma aplicação com upload…e estou com problemas…como vi q vc jah conseguiu desenvolver talvez possa me ajudar…utilizo struts, eclipse, jboss…
o erro q esta ocorrendo é o seguinte:

procurei aqui no forum sobre o erro, pareçe q é alguma coisa relacionada a classpath, arquivo .jar…
porem jah adicionei o arquivo .jar na pasta web-inf/lib, declarei ele no meu projeto dentro do eclipse e o erro persistiu…
´

alguem poderia me dar uma ajuda mais detalhada do q fazer??

Cara por favor diz a solução como foi que vc conseguiu resolver esse problema estou com ele tb.

Não consigo passar mais de um parametro para minha servlet quando está com o enctype=“multipart/form-data” !!

VALEU !!

Cara, vc conseguiu fazer o upload da imagem, jogando-a para um espaço físico no seu servidor?

se sim, pode me passar o font? vlw!!!

Cara eu fiz a Gambiarra das Gambiarras !!! :grin:

Eu coloquei o Multipart antes de tudo no metodo post

	isMultipartEvent = FileUpload.isMultipartContent(request);
	
	if (isMultipartEvent){
		DiskFileUpload uploadEvent = new DiskFileUpload();
		
		try {
			parametros = uploadEvent.parseRequest(request);
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Iterator iter = parametros.iterator();
		while (iter.hasNext()) {
			FileItem item = (FileItem) iter.next();
			if (item.isFormField()) {
				if (item.getFieldName().equalsIgnoreCase("event")){
					event = item.getString();
				}
			}
		}
	}

TA VENDO O if (item.getFieldName().equalsIgnoreCase(“event”)){
event = item.getString();

No Lugar do event vc coloca o parametro que quiser que vem do JSP
joga esse parametro dentro de uma String ou algo que vc precisar !! :cool: