Problemão... enctype=multipart/form-data

Java

09/04/2009

Seguinte... Em um site, tenho um formulário de curriculo onde o visitante preenche uns campos(Nome, email e tal)... e depois anexa o curriculo(doc, pdf, oq seja). Até ai blz! O Upload do arquivo eu ja vi q existe vários tópicos a respeito, no problem. Mas o problema aqui é o seguinte: Defino meu <form> com o atributo [b]enctype="multipart/form-data"[/b], coloco os input TEXT e FILE... BLz! Entao vou testar: preencho os campos e quando dou um SUBMIT... os campos de texto nao são enviados para pagina do ACTION. É como se eu nao tivesse preenchido os campos. estranho d+!! Basta eu apagar esse [b]enctype="multipart/form-data"[/b] q os dados aparecem. Mas ai o UPLOAD num rola!! Putz.. ai fica difícil. Até agora estou fazendo "gambiarras" com Iframe, fazendo um form somente pro upload com o bendito [b]enctype="multipart/form-data"[/b] que depois retorna pro form original com os textos.. assim vai.. complicação geral. Alguem se deparou com esse problema ae já? Deve haver um jeito de submeter um único <FORM> com FILE + CAMPOS TEXTO sem q ocorra esse problema. Me salvem please! :cry:
Ugo Cavalcanti

Ugo Cavalcanti

Curtidas 0

Respostas

Dalton

Dalton

09/04/2009

Porque você não faz uma popup pra enviar este seu doc?
GOSTEI 0
Ugo Cavalcanti

Ugo Cavalcanti

09/04/2009

Rapaz... eu queria mesmo fazer tudo num form só. Nao queria abrir um popup, outra janela. Num é possível que nao se possa fazer um POST de tipos TEXT e FILE.. normalmente. Sem esse problema ae! Com enctype="multipart/form-data" os textos nao passam. Sem ele, é o upload q nao roda.. afff :cry:
GOSTEI 0
Antonio Amorim

Antonio Amorim

09/04/2009

Ja passei por isso meu velho, é um saco mesmo, mais vamos a solução Tem duas formas de resolver, se vc estiver usando o componente da jakarta, o fileupload, vc tem que pegar estes campos atraves do proprio objeto da jakarta. vc pode resover isso tabem passando os campos pelo action do formulario em javascript, fazendo o seguinte
<script>
url = "/servlet/Upload?campo1" + window.document.forms[0].campo1.value

window.document.forms[0].action = url
window.document.forms[0].submit();
</script>
testa ai e me fala... :!:
GOSTEI 0
Junior Sousa

Junior Sousa

09/04/2009

afamorim eu também estou com o mesmo problema que o nosso amigo citou acima, mas eu não entendi a sua explicação. Eu tenho uma form onde são preenchidos alguns dados e inclusive um dos campos que é um combo é carregado com um objeto de dados e no form tem uma opção de upload de arquivos. A princípio eu estava tentando colocar um link para ir para outra página onde somente eu carregava o arquivo em um diretório e depois retornava para a página de cadastro com o nome do arquivo listado na página, mas com isso eu perdia os dados e o objeto que eu tinha carregado pela primeira vez. Até tentei guardar os dados na sessão, mas o objeto que era carregado no combo que é um dos elementos mais importante do meu form não era carregado. Com isso resolvi colocar o campo para carregar o arquivo na própria página de cadastro, mas acabei tendo o mesmo problema do nosso amigo. Vc pode exemplificar melhor a sua solução?
GOSTEI 0
Junior Sousa

Junior Sousa

09/04/2009

Usem o fileUpload do jakarta commons. Vou tentar dar um exemplo:
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

Public class FazendoUpload
{
   public void service(HttpServletRequest solicitacao, HttpServletResponse resposta)
   throws ServletException, IOException
   {
	ServletFileUpload upload = null;
	DiskFileItemFactory factory = new DiskFileItemFactory();
	factory.setSizeThreshold(4096);
	factory.setRepository(new File("PATH_PARA_SALVAR_ARQUIVOS_GRANDES"));
	upload = new ServletFileUpload(factory);
	fileItems = upload.parseRequest(solicitacao);
	Iterator it = fileItems.iterator();
	FileItem fitem = null;
	FileItem farquivo = null;
	String cadastrante = "";

	while (it.hasNext())
	{
		fitem = (FileItem) it.next();
		if (fitem.isFormField())
		{
			if(fitem.getFieldName().equals("nomeCadastrante"))
			{
				cadastrante = fitem.toString();
			}
		}
		else
		{
			farquivo = fitem;
		}
	}

   }
}
Ou seja, ele vai criar uma lista de itens com tipos. Se não for campo é porque é arquivo. Aí você recupera qual o arquivo. abraços, otávio
GOSTEI 0
Junior Sousa

Junior Sousa

09/04/2009

[quote="ugo"]Rapaz... eu queria mesmo fazer tudo num form só. Nao queria abrir um popup, outra janela. Num é possível que nao se possa fazer um POST de tipos TEXT e FILE.. normalmente. Sem esse problema ae! Com enctype="multipart/form-data" os textos nao passam. Sem ele, é o upload q nao roda.. afff :cry:
Cara, ja tentei fazer tudo em uma so form e foi um prego muito grande, a melhor decisao q axei foi criar uma janela de popup, muito melhor, facil e bonito :D AEws!
GOSTEI 0
Junior Sousa

Junior Sousa

09/04/2009

Esta foi a minha solução:
<script>
   function createURL() {
      var _form = document.getElementById("form1");
	  _form.action += "InsertPortofolio.jsp?ra="+<%=request.getParameter("ra")%>+"&disciplina="+<%=request.getParameter("disciplina")%> + "&descricao=" + _form.descricao.value;
	  alert(_form.action);
	  _form.submit();
   }
</script>
</head>

<body >
<form id="form1" action="" enctype="multipart/form-data" method="post" >
    
    <div class="form">Descrição</div>
	<div class="form1"><input name="descricao" type="text" class="fmcampost" id="descricao" size="40"/></div><br />
    <div class="form">Arquivo</div>
	<div class="form1"><input type="file" name="Filename" id="confbtproc" class="fmcampost" size="40" /> <input type="submit" name="confupload" onclick="createURL()" id="confupload" value="Upload" class="btcampos"  /></div>
	</form>
O campo em questão que precisa do valor era o "descricao".
GOSTEI 0
Junior Sousa

Junior Sousa

09/04/2009

ao invés de colocar id='blablabla' coloque name='blablal' pode ser que os campos TEXT sejam lidos. no php é assim... ele não lê os campos que só estão escritos a `id`.... precisa-se do `name` Exemplo: <input type='text' name='textododigo' /> esse ele lê <input type='text' id='textododigo' /> esse ele não lê Geralmente `id` eu mando ler com JavaScript.. Abração
GOSTEI 0
Tiago Lopes

Tiago Lopes

09/04/2009

HTML OBS: Se nao tiver enctype="multipart/form-data" nao funciona. <form method="POST" enctype="multipart/form-data"> <label>Upload:</label> <input type="file" name="arquivo" /><br/> </form> PHP $nome_temporario= $_FILES["arquivo"]["tmp_name"];// Local onde o arquivo fica salvo temporariamento na minha maquina $nome_real = $_FILES["arquivo"]["name"];// nome do arquivo copy($nome_temporario,"arquivos/$nome_real"); FIM
GOSTEI 0
Elias

Elias

09/04/2009

Alguém pode me dar uma luz... Estou tentando fazer isso tb usando Struts2 e o FileUpload... Não consigo pegar os campos da tela, vejam: class Action if (FileUpload.isMultipartContent(request)){ //verificando se o form possui campo(s) com dado(s) binário(s) DiskFileUpload fu = new DiskFileUpload(); //criando o objeto para cuidar do upload fu.setSizeMax(800000); //setando o tamanho máximo em bytes para upload try { List items = fu.parseRequest(request); //parseando a requisição e retornando uma lista com os campos encontrando (textos e/ou dados binários) Iterator i = items.iterator(); FileItem fi; String cmt = null; while (i.hasNext()) { //laço para pegar todos os campos do form fi = (FileItem)i.next(); if (fi.isFormField()) { //teste para ver se o campo em questão é campo do formulario ou um arquivo cmt = fi.getString(); //pegando o valor do campo do formulário (comentário) }else{ int size = (int) fi.getSize(); //obtendo o tamanho da foto byte[] imagem = new byte[size]; //array de byte para armazenar a foto upload.read(imagem, 0, size); //carregando a foto no array FotoTeste fotoTesteBean = new FotoTeste(); fotoTesteBean.setComentario(cmt); fotoTesteBean.setFoto(imagem); PessoaDAO dao = new PessoaDAO(); dao.salvarFotoTeste(fotoTesteBean); } } }catch (FileUploadException e){ System.out.println("Erro no upload do arquivo"); }catch (SQLException e){ System.out.println("Erro na consulta com o banco de dados"); }catch (Exception e){ System.out.println(e.getMessage()); } { System.out.println("O Formulário não possui dados binários"); } } [/code] JSP <%-- Document : popupWindow_tab_pessoas Created on : 23/09/2010 Author : André Asantos --%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Upload de Fotos</title> </head> <body bgcolor="#FFFFFF"> <h2>Upload de Fotos</h2><br /> <form action="fotosGravadas!fazUploadFoto.action" method="get" enctype="multipart/form-data" name="foto_up" id="foto_up"> <input type="text" name="comentario"><br /> <input type="file" name="foto"><br /> <input type="submit" value="enviar"> </form> </body> </html> [code]
GOSTEI 0
Cristina Constantin

Cristina Constantin

09/04/2009

O exemplo do [b]amauri_m[/b] é bom e funciona.
GOSTEI 0
Rafael Diniz

Rafael Diniz

09/04/2009

Pessoal Vcs sabem como fazer para pegar o caminho do arquivo? pois to apanhando demais disso... to usando o filaupload só que em alguns browsers ele só passo o nome do arquivo e não o caminho completo... alguem sabe uma função que burle isso?
GOSTEI 0
POSTAR