Código php para upload de arquivos [RESOLVIDO]

13. Re: Código php para upload de arquivos [RESOLVIDO]

Andressa Moura
andressa.moura

(usa Ubuntu)

Enviado em 03/05/2011 - 22:03h

Oi Alex Castilho!

É eu não tinha entendido msmo...
Corrigi os erros cmo vc disse, mas agora dá "erro ao enviar arquivo". Não retorna nada de sintaxe, acho q tem a ver com o fopen.
Da primeira vez q testei o script tive q criar o usuarios.txt usando o comando touch. Então acredito q dessa vez tbm ele não esteja criando o arquivo.
O q eu posso fazer?

O q falei sobre o email, seria para enviar apenas o formulario, nao o anexo (os arquivos enviados ficarão numa pasta compartilhada). Isso é mto difícil?

Mto obrigada.
Até mais!


  


14. Correção

Perfil removido
removido

(usa Nenhuma)

Enviado em 03/05/2011 - 22:48h

Vamos ver...

Vou mostrar uma coisa, que no início parece complicadíssimo, mas com o tempo você vai entender: as aspas.

As aspas simples ' ', ou as aspas duplas " ", funcionam da seguinte maneira. As aspas simples não interpretam caracteres especias como o $, ela os trata como string, lá vai exemplo:

<?php
$nome = 'Alex Castilho';
echo '$nome';
echo '<br/>';
echo "$nome";
?>

Saída:
$nome
Alex Castilho


Agora ficou mais fácil ver o erro não é?
$destino = 'fotos/'.'$nome.';

Você acha que a variável $destino está recebendo qual valor?
fotos/$nome ou fotos/(nome do usuário)

Lembre-se que o linux tem uma rigorosa arquitetura em relação as permissões, então para criar arquivos é necessário dar a permissão nas pastas para escrita.

A função mail é muito simples, se o seu servidor estiver configurado corretamente para usá-la você não terá problemas, ela funciona assim:

<?php
mail("E-MAIL","ASSUNTO","MENSAGEM");
?>

Fácil não é? Vamos montar então:
<?php
$meuemail = meuemail@meudominio.com.br
$assunto = "Dados recebidos por formulário";
$mensagem ="
<html>
<head>
<title>Formulário</title>
</head>
<body>
<h1>Dados informados</h1>
<p>
<b>Nome:</b>$nome
</p>
<p>
<b>Telefone:</b>$telefone
</p>
</body>
</html>
";

$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html;
charset=iso-8859-1\r\n";

//Remetente
$headers .= "From: $nome <$mail>\r\n"; // Aqui você pode usar os dados do usuário que se cadastrou
mail($meuemail,$assunto,$mensagem,$headers);
?>

Até mais!


15. Re: Código php para upload de arquivos [RESOLVIDO]

Andressa Moura
andressa.moura

(usa Ubuntu)

Enviado em 04/05/2011 - 21:17h

Ainda não está funcionando, continua com o mesmo erro.
O q pode ser?
Já corrigi tdo q vc falou.
Obrigada
[]'s


16. Erros

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/05/2011 - 21:45h

Como você modificou a linha abaixo?
$destino = 'fotos/'.'$nome.';

Ou poste o seu código pra ter uma idéia





17. Re: Código php para upload de arquivos [RESOLVIDO]

Andressa Moura
andressa.moura

(usa Ubuntu)

Enviado em 04/05/2011 - 22:34h

<?php
$nome = $_POST['nome'];
$email = $_POST['email'];
$telefone =$_POST['telefone'];
$servico =$_POST['servico'];
$tamanho =$_POST['tamanho'];
$qualidade =$_POST['qualidade'];
$mensagem =$_POST['mensagem'];
$arquivo = $_FILES['arquivo']['tmp_name'];
$destino = 'fotos/'.'$nome.';

if(move_uploaded_file($arquivo,$destino)){
$fp = fopen($nome.'.txt','a');
$arquivo_nome = $nome.'.'.$arquivo;
$linha = $arquivo_nome.';'.$nome.';'.$email.';'.$telefone.';'.$servico.';'.$tamanho.';'.$qualidade.';'.$mensagem.";\r\n";
fwrite($fp,$linha,strlen($linha));
fclose($fp);
echo "<script>window.alert('Enviado com sucesso.');</script>";
} else echo "<script>window.alert('Erro ao enviar o arquivo');</script>";

?>

_____________________________________________



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<title>Enviar Arquivo</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="stilo.css" type="text/css" />
<meta name="generator" content="Geany 0.19.1" />
</head>

<body>

<div id="todo">
<h1>Envio de Arquivos para Impress&atilde;o Digital</h1>
<div class="form">
<form id="frm" action="cadastra.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="frm_ok" />
<fieldset>
<legend class="style1 style4"> Preencha o Formul&aacute;rio </legend>
<p >
<label for="nome"><span class="style2">Nome / Raz&atilde;o Social:</span></label>

<input name="nome" id="nome" onKeyDown="if(event.keyCode==13) event.keyCode=9;" size="35" />

</p>

<p>

<label for="email"><span class="style2">E-Mail:</span></label>

<input name="email" id="email" onKeyDown="if(event.keyCode==13) event.keyCode=9;" size="35" />

</p>

<p>

<label for="telefone"><span class="style2">Telefone:</span></label>

<input name="telefone" id="telefone" onKeyDown="if(event.keyCode==13) event.keyCode=9;" size="35" />

</p>

<p>

<label for="servico"><span class="style2">Tipo de Material:</span></label>

<input name="servico" id="servico" onKeyDown="if(event.keyCode==13) event.keyCode=9;" size="10" />

</p>

<p>

<label for="tamanho"><span class="style2">Tamanho:</span></label>

<input name="tamanho" id="tamanho" onKeyDown="if(event.keyCode==13) event.keyCode=9;" size="10" />

</p>
<div
<p>

<label for="qualidade"><span class="style2">Qualidade (Alta ou Grandes Formatos):</span></label>
<input name="qualidade" id="qualidade" onKeyDown="if(event.keyCode==13) event.keyCode=9;" size="10" />

</p>


<p>

<label for="mensagem"><span class="style2">Anexo:</span></label>

<input type="file" name="arquivo[]" size="50" class="file" />

</p>
<p>

<label for="mensagem"><span class="style2">Mensagem:</span></label>

<textarea name="mensagem" cols="100" rows="10" class="text" id="mensagem"></textarea>

</p>

<p style="text-align:right; padding-right:10px;">

<input name="submit" type="submit" class="send" value="ENVIAR" />

</p>
</fieldset>
</form>
</div>
</div>
</body>
</html>
________________________________

Aí estão os dois arquivos, o index e o php.
Mas o html ficou bem mal formatado por causa do espaço.
Espero que dê pra entender.

Obrigada! Até...


18. Código errado

Andressa Moura
andressa.moura

(usa Ubuntu)

Enviado em 04/05/2011 - 22:39h

Desculpa eu postei o código antigo.
Nesse eu aleterei certo -> $destino = 'fotos/'."$nome.";

<?php
$nome = $_POST['nome'];
$email = $_POST['email'];
$telefone =$_POST['telefone'];
$servico =$_POST['servico'];
$tamanho =$_POST['tamanho'];
$qualidade =$_POST['qualidade'];
$mensagem =$_POST['mensagem'];
$arquivo = $_FILES['arquivo']['tmp_name'];
$destino = 'fotos/'."$nome.";

if(move_uploaded_file($arquivo,$destino)){
$fp = fopen($nome.'.txt','a');
$arquivo_nome = $nome.'.'.$arquivo;
$linha = $arquivo_nome.';'.$nome.';'.$email.';'.$telefone.';'.$servico.';'.$tamanho.';'.$qualidade.';'.$mensagem.";\r\n";
fwrite($fp,$linha,strlen($linha));
fclose($fp);
echo "<script>window.alert('Enviado com sucesso.');</script>";
} else echo "<script>window.alert('Erro ao enviar o arquivo');</script>";

?>


19. Re: Código php para upload de arquivos [RESOLVIDO]

Andressa Moura
andressa.moura

(usa Ubuntu)

Enviado em 07/05/2011 - 21:54h

Olá Alex Castilho!

Seu script está mto bom msmo, funcionou.
Eu apenas estou alterando algumas coisas de acordo com minhas necessidades. Ex: estou salvando a imagem dessa forma > nome.nomeoriginal.

E gostaria de deixar o txt mais organizado, com mais linhas. Tentei usar o \r\n mas nao deu certo. Pesquisei um pouco e vi essa variavel $quebra = chr(13).chr(10); para fazer a quebra de linha.
Porém não estou conseguindo por pra funcionar com o fwrite. Está assim:


if(move_uploaded_file($arquivo,$destino)){
$fp = fopen('fotos/'.removerCaracter($nome).'.txt','a');
$linha1 = $nome.';'.$original.';'.$email.';'.$telefone.";\r\n";
$linha2 =$servico.';'.$tamanho.';'.$qualidade.';'.$mensagem.";\r\n";
fwrite($fp,$linha1,$quebra,$linha2);
fclose($fp);


Já tentei de outras formas mas realmente não sei qual a sintaxe correta.

E muito obrigada msmo por estar me ajudando. Vc tm demonstrado mta paciencia já q estou começando a aprender php.

Até mais! Valeu!


20. Erro pode estar na função

Perfil removido
removido

(usa Nenhuma)

Enviado em 07/05/2011 - 22:32h

Que bom Andressa, fico feliz por ajudá-la e ver o quanto você está evoluindo no php

A função fwrite(), tem a seguinte estrutura:
fwrite(ARQUIVO, CONTEÚDO, QTD DE CARACTERES QUE SERÃO INSERIDOS);

Repare que tem 3 argumentos, separados por vírgula.

Ex: fwrite ($fp,$linha, strlen($linha))

Vou explicar:
1º Argumento - A variável $fp é o arquivo que você abriu com a função fopen() e informando qual o modo
2º Argumento - A variável $linha é o que será inserido no arquivo
3º Argumento - Como o conteúdo que você vai inserir pode variar de tamanho, utiliza-se uma outra função chamada strlen(), para retornar a quantidade de caracteres que foram informados naquela variável.

Agora vamos analisar o que você está fazendo?
fwrite($fp,$linha1,$quebra,$linha2);

Você passa pra função 4 argumentos e outra coisa, não precisa usar 2 variáveis de linha($linha1 e $linha2), basta concatenar e fazer em apenas uma. Vamos fazer?

$linha = $nome.';'.$original.';'.$email.';'.$telefone.";\r\n".$servico.';'.$tamanho.';'.$qualidade.';'.$mensagem.";\r\n";
fwrite($fp,$linha,strlen($linha));

Tente agora, espero que funcione


21. Funcionando!

Andressa Moura
andressa.moura

(usa Ubuntu)

Enviado em 08/05/2011 - 21:25h

Obrigada! Agora está funcionando!

Não quero ser chata, mas preciso de mais algumas funções e tbm quero continuar aprendendo.

Eu vi em outro php um array para liberar apenas algumas extensões e gostaria de usa-lo. Tentei aqui mas não sei bem onde colocar. O arquivo é enviado mesmo sendo de outra extensão

Poderia me explicar como isso funciona?

Sei que este é o código que faz o bloqueio mas nesse novo php não está funcionando.

$_UP['extensoes'] = array('jpg', 'jpeg', 'png', 'eps', 'psd', 'tif', 'cdr', 'pdf', );
$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));
if (array_search($extensao, $_UP['extensoes']) === false) {
echo "Por favor, envie arquivos com as seguintes extensões: jpg, png, eps, cdr, psd, tif ou pdf";
}

Obrigada ;)


22. Vamos lá...

Perfil removido
removido

(usa Nenhuma)

Enviado em 09/05/2011 - 00:57h

Vamos analisar o código, são bastantes funções legais que foram usadas e inclusive possue erros.

Uma forma simples de declarar uma array com índices numéricos começando do 0 até N no php é através de array() e com valores separados por vírgula:

$variaveis = array ('jpg', 'jpeg', 'png', 'eps', 'psd', 'tif', 'cdr', 'pdf');

Isso criará uma array começando da posição 0 até a posição 7, lembrando que para o php sempre se inicia pelo 0 (zero). Então quando você ecoar $variaveis[0], vai retornar jpg;

Ex: echo $variaveis[7];
Saída: pdf

Um pouco fácil, mas porque eu escrevi isso?

Vamos analisar o código que você escreveu:
$_UP['extensoes'] = array('jpg', 'jpeg', 'png', 'eps', 'psd', 'tif', 'cdr', 'pdf', );

Primeira sugestão é, coloque o nome da array mais fácil de entender, $extensoes é uma boa escolha, segundo, observe no final do código uma vírgula perdida, que tal removê-la?

A função explode() é para uma criar array, apartir de uma string e usando delimitadores, lembra que você escreve no seu txt delimitando usando o ; (ponto e vírgula)? É a mesma ideia, então vamos analisar o código:

explode('.', $_FILES['arquivo']['name']);

Até aqui tudo certo, ele vai criar uma array, apartir do nome ORIGINAL do arquivo, ou seja, o nome do arquivo na sua máquina antes do upload e usar o delimitador . (ponto).

Ex: Nome do Arquivo: alexcastilho.jpg
$arquivo = explode('.',$_FILES['arquivo']['name']);
echo 'Nome do Arquivo: '. $arquivo[0].'<br/>';
echo 'Extensão provável do arquivo: '.$arquivo[1];

Saída:
Nome do Arquivo: alexcastilho
Extensão provável: jpg

Fácil não? Porque eu coloquei extensão provável? É por causa disso que foi usado a função end()

Imagine que o arquivo seja alex.castilho.jpg, usando o explode() já dá pra adivinhar como vai sair o código acima?
Saída:
Nome do Arquivo: alex
Extensão provável: castilho

Tudo errado né? Então usou-se a função end() que retorna o valor do último elemento dentro da array.

Então vamos colocar aqui
$arquivo = end(explode('.',$_FILES['arquivo']['name']));
echo 'Extensão do arquivo: '.$arquivo;

Saída:
Extensão do arquivo: jpg

Mas repare que perdemos o nome do arquivo, mas isso é um mero detalhe já que você quer mesmo a extensão do arquivo.

Você já deve estar cansada em ouvir falar em algo chamado CASE SENSITIVE, e no php não é diferente e pode te dar uma dor de cabeça tremenda. JPG não é igual a jpg.
As funções strtolower() e strtoupper() resolvem esses problemas, strtolower() faz com que todo o seu conteúdo fique em minúsculas e strtoupper() faz com que todo o seu conteúdo fique em MAIÚSCULAS, ok?

Vamos analisar parte do seu código agora?
$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));

Aqui está tudo certo, ele vai retornar a extensão do arquivo com nome original, mas agora você já consegue ver o que ele faz passo a passo. Certo?

A função array_search() é uma bela função e uma mão na roda, mas ela tem algo que.... como eu poderia dizer... uma "PEGADINHA DO MALANDRO!", que se você não tomar cuidado vai ficar horas procurando até tomar coragem de ler o manual do php pra entender. Essa função retorna pra você a POSIÇÃO da array para aquele elemento que foi informado, e não se aquele elemento foi encontrado ou não.

Outra coisa sobre comparações, = você atribui um valor à uma variável, == sinal da igualdade e === é idêntico, isso confunde muito, mas muito mesmo, até aqueles caras que se acham o máximo em php as vezes perdem horas com um if com o = ao invés de um ==.

Ufa, finalmente vamos ver o código como um todo?
$_UP['extensoes'] = array('jpg', 'jpeg', 'png', 'eps', 'psd', 'tif', 'cdr', 'pdf', );
$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));
if (array_search($extensao, $_UP['extensoes']) === false) {
echo "Por favor, envie arquivos com as seguintes extensões: jpg, png, eps, cdr, psd, tif ou pdf";
}

Eu não recomendo usar o ===, principalmente em relação a casos de false e ainda mais nessa função que já mudou seus valores de retorno durante a evolução do PHP, ou seja, as vezes ela retorna o 0(zero) quando não acha as vezes o false. Então vamos mudar isso. Re-escrevendo o código com tudo o que agente já escreveu lá em cima:

$extensoes=array('-','jpg', 'jpeg', 'png', 'eps', 'psd', 'tif', 'cdr', 'pdf');
$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));
if (array_search($extensao, $extensoes)) {
/*
AQUI VOCÊ INCLUI O CÓDIGO PARA O CADASTRO
*/
} else echo "Por favor, envie arquivos com as seguintes extensões: jpg, png, eps, cdr, psd, tif ou pdf";


Eu usei o primeiro elemento da array com um -, apenas pra ele não me retornar a posição 0 e me retornar apenas 1,2,3 e assim por diante.

Espero que funcione


23. Mto bom

Andressa Moura
andressa.moura

(usa Ubuntu)

Enviado em 11/05/2011 - 20:15h

Muito bom seu código! Está funcionando bem.
Mto obrigada por toda essa ajuda.

Rebusquei nos posts o que vc falou sobre enviar o form por email. Será q vc poderia explicar um pouco mais sobre isso? O q eu preciso ter instalado no servidor pra q a função mail funcione corretamente? (Lembrando que o email de destino será de um domínio comum como hotmail, gmail, etc).

Obrigada e desculpe a persistência...


24. Pergunta...

Perfil removido
removido

(usa Nenhuma)

Enviado em 11/05/2011 - 22:22h

Andressa fique tranquila, pode perguntar à vontade.

Deixa eu te perguntar, o que você vai enviar via e-mail? Apenas os dados ou anexar algum arquivo? Estou perguntando pois:

1 - Se for apenas dados, você pode usar o mail(), mas lembre-se de ter um servidor smtp configurado no servidor de hospedagem dentro das configurações do php.ini também existem configurações para utilizar essa função.

2 - Se for anexar arquivos, eu recomendaria usar alguma solução já pronta, eu tenho uma classe que faz autenticação smtp e envio de arquivos anexados. E até que o nível não é tão alto. Basta configurar o endereço do servidor, login, senha e saber qual o tipo de envio é realizado.

Aguardo resposta...



01 02 03



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts