Fórum Problemão... enctype="multipart/form-data" #568194
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:
Posts
Porque você não faz uma popup pra enviar este seu doc?
09/04/2009
Ugo Cavalcanti
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:
09/04/2009
Antonio Amorim
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...
:!:
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?
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
[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!
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".
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
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
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]
24/02/2011
Cristina Constantin
O exemplo do [b]amauri_m[/b] é bom e funciona.
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?