Upload de multiplos arquivos com PHP

Um excelente tutorial sobre upload por Henrique, do PHP-BR
(http://phpbr.wordpress.com/2007/02/22/upload-de-multiplos-arquivos-com-php/)

Fala pessoal!
A pedido do leitor Rodrigo Almeida, vou escrever aqui um mini tutorial de como criar um formulário para upload de multiplos arquivos.
Para começar então, vou demonstrar como se cria um formulário para upload de um único arquivo, e depois passaremos para upload de multiplos arquivos.


<?php

if( isset( $_POST[‘enviar’] ) ) {

$erro = ;
$pathToSave = ‘/tmp/’;

// A variavel $_FILES é uma variável do PHP, e é ela a responsável
// por tratar arquivos que sejam enviados em um formulário

if( $_FILES[‘arquivo’][‘name’] != ) {
$arquivoTmp = $_FILES[‘arquivo’][‘tmp_name’];
$arquivo = $pathToSave.$_FILES[‘arquivo’][‘name’];

// Copia o arquivo para o sistema
if( !move_uploaded_file( $arquivoTmp, $arquivo ) ) {
$erro = ‘Erro no upload. Verifique as permissoes do diretorio’;
}
} else {
$erro = ‘É necessario escolher um arquivo para enviar’;
}

}

?>

<form method=’POST’ enctype=’multipart/form-data’>
Arquivo: <input type=’file’ name=’arquivo’>
<br>
<input type=’submit’ value=’Enviar’ name=’enviar’>
</form>

O exemplo por si só é bastante explanatório. Certifique-se de que você substituiu o caminho no qual deseja salvar o arquivo, e que o usuário que está executando o php tem permissão para escrever nesse diretório.O comando move_uploaded_file é reponsável por pegar o arquivo que foi enviado, e então salva-lo no local que você especificou. Seguindo em frente então, vamos ver como fazer o envio de multiplos arquivos no mesmo formulário.
Vejamos um segundo exemplo:


<?php

if( isset( $_POST[‘enviar’] ) ) {

$pathToSave = ‘/tmp/’;

// A variavel $_FILES é uma variável do PHP, e é ela a responsável
// por tratar arquivos que sejam enviados em um formulário
// Nesse caso agora, a nossa variável $_FILES é um array com 3 dimensoes
// e teremos de trata-lo, para realizar o upload dos arquivos
// Quando é definido o nome de um campo no form html, terminado por []
// ele é tratado como se fosse um array, e por isso podemos ter varios
// campos com o mesmo nome
$i = 0;
$msg = array( );
$arquivos = array( array( ) );
foreach(
$_FILES as $key=>$info ) {
foreach(
$info as $key=>$dados ) {
for(
$i = 0; $i < sizeof( $dados ); $i++ ) {
// Aqui, transformamos o array $_FILES de:
// $_FILES[”arquivo”][”name”][0]
// $_FILES[”arquivo”][”name”][1]
// $_FILES[”arquivo”][”name”][2]
// $_FILES[”arquivo”][”name”][3]
// para
// $arquivo[0][”name”]
// $arquivo[1][”name”]
// $arquivo[2][”name”]
// $arquivo[3][”name”]
// Dessa forma, fica mais facil trabalharmos o array depois, para salvar
// o arquivo
$arquivos[$i][$key] = $info[$key][$i];
}
}
}

$i = 1;

// Fazemos o upload normalmente, igual no exemplo anterior
foreach( $arquivos as $file ) {

// Verificar se o campo do arquivo foi preenchido
if( $file[‘name’] != ) {
$arquivoTmp = $file[‘tmp_name’];
$arquivo = $pathToSave.$file[‘name’];

if( !move_uploaded_file( $arquivoTmp, $arquivo ) ) {
$msg[$i] = ‘Erro no upload do arquivo ’.$i;
} else {
$msg[$i] = sprintf(‘Upload do arquivo %s foi um sucesso!’,$i);
}
} else {
$msg[$i] = sprintf(‘O arquivo %d nao foi preenchido’,$i);
}

$i++;
}

// Imprimimos as mensagens geradas pelo sistema
foreach( $msg as $e ) {
printf(‘%s<br>’, $e);
}

}

?>

<form method=’POST’ enctype=’multipart/form-data’>
Arquivo1: <input type=’file’ name=’arquivo[]’><br>
Arquivo2: <input type=’file’ name=’arquivo[]’><br>
Arquivo3: <input type=’file’ name=’arquivo[]’><br>
Arquivo4: <input type=’file’ name=’arquivo[]’><br>
<br>
<input type=’submit’ value=’Enviar’ name=’enviar’>
</form>

Veja então, que no exemplo acima, criamos um formulário, onde os campos todos tem o mesmo nome, porém são tratados como um array, por terminarem com ‘[]’. A parte mais trabalhosa é entendero array que recebemos então, e trata-lo. Depois de tratado o array, prosseguimos normalmente com o upload do arquivo.
Espero que tenha ficado claro como fazer esse upload de multiplos arquivos. Se quiser entender como a variável $_FILES é, tente utilizar a funcao var_dump nela, para ver seu conteúdo, e enteder melhor o primeiro conjunto de laços foreach que foi demonstrado no exemplo.
Caso tenha permanecido alguma duvida, afinal trabalhar com arrays de 3 ou mais dimensões é um pouco mais complicado, deixe ai um comentário, que tentarei esclarecer da melhor forma possível.

Novamente, agradeço ao leitor Rodrigo Almeida pela sugestão, e peço para que todos participem, e mandem ai suas dúvidas, críticas e sugestões.

[]s

Edit: Bom, pelo visto pode estar havendo dificuldade em copiar e colar o código dos exemplos diretamente em algum editor de texto, pois o Wordpress troca as aspas simples por um tipo de aspa esquisito. Por esse motivo, enviei os códigos em formato txt.
Os links:

upload.txt – Primeiro exemplo
upload2.txt – Segundo exemplo

Comments (7)

Página de contato usando o AspEmail

O código abaixo é um modelo de página de contato que faz uso do componente AspEmail, cujo manual pode ser encontrado aqui, e não deve ser confundido com o AspMail, da ServerObjects!

Como estamos considerando e exigência de autenticação, o remetente não pode ser o usuário que preencheu o formulário. Para contornar o problema e permitir que seja possível responder diretamente por um cliente de correio, um endereço do próprio domínio do site é utilizado como remetente e ao mesmo tempo destinatário. O endereço do solicitante é utilizado como ReplyTo.

É importante lembrar que nesse exemplo não há nenhum teste de consistência. Para uso realmente profissional o desenvolvedor precisa considerar que campos devem ser obrigatórios e se o endereço preenchido é coerente. Isso pode ser feito facilmente usando-se funçôes JavaScript.

<% if Request.Form(”botao”) = “” then %>
<form method=”post”>
<table border=”1″ align=”center” cellPadding=”5″ cellSpacing=”0″>
<tr>
<td>Seu nome
<input name=”nome” /></td>
</tr>
<tr>
<td>Seu email
<input name=”email” /></td>
</tr>
<tr>
<td>Mensagem
<textarea cols=”60″ rows=”6″ name=”mensagem”></textarea></td>
</tr>
<tr>
<td><input name=”botao” type=”submit” /></td>
</tr>
</table>
</form>
<%
else
Set oMail = Server.CreateObject(”Persits.MailSender”)
oMail.Host = “mail.dominio.com.br”
oMail.From = “contato@dominio.com.br”
oMail.UserName = “contato@dominio.com.br”
oMail.PassWord = “senha”
oMail.FromName = Request.Form(”nome”)
oMail.AddAddress “contato@dominio.com.br”, “Página de contato”
oMail.AddReplyTo Request.Form(”email”), Request.Form(”nome”)
oMail.Subject = “Contato pelo site”
oMail.Body = Request.Form (”mensagem”)
oMail.Send

If Err <> 0 Then
Response.Write “<H2>Ocorreu um erro: ” & Err.Description & “</h2>”
else
Response.Write(”<H2>Obrigado, seu e-mail foi enviado com sucesso!</H2>”)
End If
Set oMail = Nothing
end if %>

O código-fonte está em http://noticias.aspecto.net/asp/contato.txt.

Comments (3)

Entendendo Trackbacks e Pingbacks

Não tenho dúvida que muitos blogueiros (de primeira ou outras viagens) se perguntem o que significa Trackback e Pingback. Eu mesmo, depois de muito tempo, só consegui encontrar a resposta hoje. E fiquei muito contente com a descoberta.

O sítio Contraditorium tem um simples e útil texto sobre o que tanto ansiávamos em saber. Entendendo Trackbacks e Pingbacks é o nome do texto (que eu repeti). Aproveite!

Comentarios

Como configurar o Gerenciador de E-mails

Importantes informações para configurar seu endereço eletrônico em um gerenciador de e-mails.

SEU DOMÍNIO

O seu domínio é tudo que vem depois do @. Em fulano@empresa.com.br, empresa.com.br é o domínio.

NOME DE USUÁRIO

No nome de usuário, sempre coloque o endereço eletrônico completo. Por exemplo, fulano@seu-dominio ao invés de somente fulano.

SERVIDOR POP3 E SMTP

Servidor POP3: mail.seu-dominio
Servidor SMTP: mail.seu-dominio

PARA O ENVIO DE MENSAGENS

Para enviar mensagens, é importante que esteja marcada a opção “Meu servidor requer autenticação” nas propriedades da conta criada.

Comentarios

Enviando mensagens com o PHPMailer

O PHPMailer é um componente de envio de e-mail para servidores que exigem autenticação ou para um desenvolvedor que deseje configurações mais avançadas para a rotina de e-mail pelo php que o a função mail() não possua. É importante percebermos que um servidor que exige autenticação o faz por razões de segurança, para que o mesmo não caia nas listas negras caracterizado como um servidor de Spams.

A seguir, um exemplo de código para envio de e-mail pelo PHPMailer (para páginas de Contato ou Fale Conosco, por exemplo).

Obs: O ideal é que você baixe o PHPMailer e coloque no seu próprio servidor, deixando com que o seu domínio sempre tenha independência e rapidez no envio de mensagens através das suas páginas.

———-

<?php
require_once("phpmailer/class.phpmailer.php");

$mail = new PHPMailer();
$mail->IsSMTP(); // send via SMTP
$mail->Host = "mail.seudominio"; //seu servidor SMTP
$mail->SMTPAuth = true; // 'true' para autenticação
$mail->Username = "usuario@seudominio"; // usuário de SMTP
$mail->Password = "senhaxxx"; // senha de SMTP
$mail->From = "de@seudominio";
//coloque aqui o seu correio, para que a autenticação não barre a mensagem
$mail->FromName = "remetente";
$mail->AddAddress("email@destinatario","Nome do Destinatario ");
$mail->AddAddress("email@destinatario"); // (opcional) só o envio pelo email
$mail->AddReplyTo("email@destinatario.copia","Nome do Destinatario com cópia");
//aqui você coloca o endereço de quem está enviando a mensagem pela sua página

$mail->WordWrap = 50; // Definição de quebra de linha
$mail->AddAttachment("/caminho/do/anexo/no/servidor.ext"); // (opcional) anexos
$mail->AddAttachment("/caminho/do/anexo/servidor.ext","nome_do_anexo.ext"); // (opcional) mais anexos
$mail->IsHTML(true); // envio como HTML se 'true'

$mail->Subject = "Assunto da mensagem ";
$mail->Body = "Conteúdo da mensagem HTML ";
$mail->AltBody = "Para mensagens somente texto";

if(!$mail->Send())
{
echo "Mensagem não enviada<br />";
echo "Mailer Error: " . $mail->ErrorInfo;
} else
{
echo "Mensagem enviada";
}
?>

———-

O código-fonte está em http://noticias.aspecto.net/php/phpmailer.php.txt

Relacionados:

Comments (13)