Você está na página 1de 11

Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.

net/mysql/upload-de-arquivos-como-tudo-funciona/

Thiago Belem / Blog


PHP, MySQL, jQuery e Desenvolvimento WEB – Por uma WEB melhor

ClubeUrbano.GROUPON.com.br/Academia PeixeUrbano.com.br/Cadastre-se

Upload de Arquivos – Como tudo funciona


Publicado em 13 de julho de 2009 por Thiago Belem

Hoje resolvi falar um pouquinho mais sobre como o upload de arquivos funciona, passo a passo,
onde cada coisa se encaixa e como você pode ter total controle dele.

Como exemplo usarei um formulário onde o visitante enviará o seu nome e uma foto para um “perfil” de um rede
social.

1.0 – O formulário HTML

Todo upload, geralmente, começa com um formulário onde o usuário insere o arquivo que será enviado e
manipulado para o servidor. Veja o nosso exemplo de formulário:

01 <form method="post" action="recebe.php" enctype="multipart/form‐data">


02 <fieldset>
03 <label for="txNome">Seu nome</label>
04 <input type="text" name="nome" id="txNome" />
05
06 <label for="txFoto">Sua foto</label>
07 <input type="file" name="arquivo" id="txFoto" />
08
09 <input type="submit" value="Salvar Dados" />
10 </fieldset>
11 </form>

É um formulário simples, com dois campos e um submit… O que importa nesse formulário são três coisas:

A propriedade action do formulário (linha 1)


No action do formulário você especifica para qual endereço você está enviando os dados… Se você não definir
essa propriedade os dados serão enviados para o mesmo endereço do formulário

A propriedade enctype do formulário (linha 1)


Você precisa definir o enctype como “multipart/form-data” para o upload funcionar, caso contrário você
não vai poder manipular os arquivos

A propriedade name do input file (linha 7)


É nesse campo que você irá enviar o arquivo para ser manipulado pelo PHP… E é a propriedade name que
você irá usar, no PHP, para saber de qual arquivos estamos falando

2.0 – Manipulando o upload no arquivo recebe.php

1 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

Agora iremos construir o arquivo recebe.php passo a passo para você entender o que acontece quando enviamos
um arquivo por upload.

Normalmente quando enviamos dados através de um formulário (com a propriedade method igual a post) esses
dados são disponibilizados em uma variável $_POST… Então, no começo do arquivo, iremos arquivar o nome do
usuário em uma nova variável:

1 <?php
2
3 $nome = $_POST['nome'];
4
5 ?>

Só pra lembrar: $_POST é um array e os seus índices serão as propriedades “name” dos inputs.

2.1 – A variável $_FILES

Ao enviar um arquivo pelo formulário acima é criada uma nova variável (além da $_POST) que é chamada
$_FILES… Essa variável funciona da mesma forma que a $_POST e é identificada pela propriedade name do
input. A diferença é que o $_FILES traz várias informações sobre o arquivo enviado.

Veja um exemplo onde pegamos todas essas informações e salvamos em novas variáveis:

01 <?php
02
03 $nome = $_POST['nome'];
04
05 // O nome original do arquivo no computador do usuário
06 $arqName = $_FILES['arquivo']['name'];
07 // O tipo mime do arquivo. Um exemplo pode ser "image/gif"
08 $arqType = $_FILES['arquivo']['type'];
09 // O tamanho, em bytes, do arquivo
10 $arqSize = $_FILES['arquivo']['size'];
11 // O nome temporário do arquivo, como foi guardado no servidor
12 $arqTemp = $_FILES['arquivo']['tmp_name'];
13 // O código de erro associado a este upload de arquivo
14 $arqError = $_FILES['arquivo']['error'];
15
16 ?>

Preste atenção que a parte ['arquivo'] se deve a propriedade name do input file no lá formulário HTML.

2.2 – Erros de upload

Quando algo der errado com o upload em questão você vai poder verificar o que aconteceu baseando-se no valor
da variável $_FILES['arquivo']['error']… Quando ela for diferente de zero é que algo de errado aconteceu e você
pode verificar aqui possíveis valores de erro no upload.

2.3 – Movendo o arquivo para a pasta certa

Agora iremos mover o arquivo para a pasta correta caso o upload tenha ocorrido sem problemas:

01 <?php
02

2 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

03 $nome = $_POST['nome'];
04
05 // O nome original do arquivo no computador do usuário
06 $arqName = $_FILES['arquivo']['name'];
07 // O tipo mime do arquivo. Um exemplo pode ser "image/gif"
08 $arqType = $_FILES['arquivo']['type'];
09 // O tamanho, em bytes, do arquivo
10 $arqSize = $_FILES['arquivo']['size'];
11 // O nome temporário do arquivo, como foi guardado no servidor
12 $arqTemp = $_FILES['arquivo']['tmp_name'];
13 // O código de erro associado a este upload de arquivo
14 $arqError = $_FILES['arquivo']['error'];
15
16 if ($arqError == 0) {
17 $pasta = '/uploads/';
18 $upload = move_uploaded_file($arqTemp, $pasta . $arqName);
19 }
20
21 ?>

Com isso, após verificar se não houve nenhum erro, iremos mover o arquivo que está na pasta temporária do
PHP para a pasta /uploads/ do seu site.

A função move_uploaded_file() usa dois argumentos: o primeiro é o nome do arquivo temporário e o


segundo é local onde o arquivo será salvo (incluindo seu novo nome)… No caso usamos o nome original do
arquivo, mas caso você queira renomear o arquivo é exatamente nessa linha (18) que você deve fazer isso.

Depois do upload a variável $upload terá um valor lógico (true ou false) que indica se o arquivo foi movido com
sucesso ou não.

Nosso upload já está pronto… O problema é que ele aceita qualquer tipo de arquivo e não é isso que queremos.

3.0 – Validando o tipo de arquivo enviado

Usando a variável $arqType poderemos identificar qual é o tipo do arquivo… Esse tipo é chamado de
mime-type.

Vamos criar uma lista com todos os mime-types permitidos e verificar se foi enviado um arquivo com o tipo
correto:

01 <?php
02 // Lista de tipos de arquivos permitidos
03 $tiposPermitidos= array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png');
04
05 $nome = $_POST['nome'];
06
07 // O nome original do arquivo no computador do usuário
08 $arqName = $_FILES['arquivo']['name'];
09 // O tipo mime do arquivo. Um exemplo pode ser "image/gif"
10 $arqType = $_FILES['arquivo']['type'];
11 // O tamanho, em bytes, do arquivo
12 $arqSize = $_FILES['arquivo']['size'];
13 // O nome temporário do arquivo, como foi guardado no servidor
14 $arqTemp = $_FILES['arquivo']['tmp_name'];
15 // O código de erro associado a este upload de arquivo
16 $arqError = $_FILES['arquivo']['error'];
17

3 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

18 if ($arqError == 0) {
19 // Verifica o tipo de arquivo enviado
20 if (array_search($arqType, $tiposPermitidos) === false) {
21 echo 'O tipo de arquivo enviado é inválido!';
22 // Não houveram erros, move o arquivo
23 } else {
24 $pasta = '/uploads/';
25 $upload = move_uploaded_file($arqTemp, $pasta . $arqName);
26 }
27 }
28
29 ?>

Se precisar você ver aqui uma lista de mime-types usados por cada tipo de arquivo.

4.0 – Validando o tamanho do arquivo enviado

Muita gente tem problemas com o tamanho de arquivo enviado pelos usuários pois, dependendo da quantidade e
do tipo de arquivo, você rapidamente vai ter GBs e GBs de lixo no seu servidor. Se quiser fazer essa validação, é
só fazer assim:

01 <?php
02 // Lista de tipos de arquivos permitidos
03 $tiposPermitidos= array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png');
04 // Tamanho máximo (em bytes)
05 $tamanhoPermitido = 1024 * 500; // 500 Kb
06
07 $nome = $_POST['nome'];
08
09 // O nome original do arquivo no computador do usuário
10 $arqName = $_FILES['arquivo']['name'];
11 // O tipo mime do arquivo. Um exemplo pode ser "image/gif"
12 $arqType = $_FILES['arquivo']['type'];
13 // O tamanho, em bytes, do arquivo
14 $arqSize = $_FILES['arquivo']['size'];
15 // O nome temporário do arquivo, como foi guardado no servidor
16 $arqTemp = $_FILES['arquivo']['tmp_name'];
17 // O código de erro associado a este upload de arquivo
18 $arqError = $_FILES['arquivo']['error'];
19
20 if ($arqError == 0) {
21 // Verifica o tipo de arquivo enviado
22 if (array_search($arqType, $tiposPermitidos) === false) {
23 echo 'O tipo de arquivo enviado é inválido!';
24 // Verifica o tamanho do arquivo enviado
25 } else if ($arqSize > $tamanhoPermitido) {
26 echo 'O tamanho do arquivo enviado é maior que o limite!';
27 // Não houveram erros, move o arquivo
28 } else {
29 $pasta = '/uploads/';
30 $upload = move_uploaded_file($arqTemp, $pasta . $arqName);
31 }
32 }
33
34 ?>

5.0 – Renomeando o arquivo enviado

Caso você queira armazenar o arquivo enviado com outro nome, mas manter a extensão do mesmo, é só fazer

4 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

assim:

01 <?php
02 // Lista de tipos de arquivos permitidos
03 $tiposPermitidos= array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png');
04 // Tamanho máximo (em bytes)
05 $tamanhoPermitido = 1024 * 500; // 500 Kb
06
07 $nome = $_POST['nome'];
08
09 // O nome original do arquivo no computador do usuário
10 $arqName = $_FILES['arquivo']['name'];
11 // O tipo mime do arquivo. Um exemplo pode ser "image/gif"
12 $arqType = $_FILES['arquivo']['type'];
13 // O tamanho, em bytes, do arquivo
14 $arqSize = $_FILES['arquivo']['size'];
15 // O nome temporário do arquivo, como foi guardado no servidor
16 $arqTemp = $_FILES['arquivo']['tmp_name'];
17 // O código de erro associado a este upload de arquivo
18 $arqError = $_FILES['arquivo']['error'];
19
20 if ($arqError == 0) {
21 // Verifica o tipo de arquivo enviado
22 if (array_search($arqType, $tiposPermitidos) === false) {
23 echo 'O tipo de arquivo enviado é inválido!';
24 // Verifica o tamanho do arquivo enviado
25 } else if ($arqSize > $tamanhoPermitido) {
26 echo 'O tamanho do arquivo enviado é maior que o limite!';
27 // Não houveram erros, move o arquivo
28 } else {
29 $pasta = '/uploads/';
30 // Pega a extensão do arquivo enviado
31 $extensao = strtolower(end(explode('.', $arqName)));
32 // Define o novo nome do arquivo usando um UNIX TIMESTAMP
33 $nome = time() . '.' . $extensao;
34
35 $upload = move_uploaded_file($arqTemp, $pasta . $nome);
36 }
37 }
38
39 ?>

Na linha 31 pegamos a extensão do arquivo enviado e na linha 33 criamos um novo nome para ele usando um
UNIX TIMESTAMP e a extensão original.

6.0 – Salvando tudo no banco de dados

Acabamos de passar por todas as partes do upload e manipulação de um arquivo!

Agora vamos salvar os dados recebidos no banco de dados apenas para concluir o exemplo da criação de um perfil
em uma rede social:

01 <?php
02
03 // Aqui você faz a conexão com o banco de dados
04
05 // Lista de tipos de arquivos permitidos
06 $tiposPermitidos= array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png');
07 // Tamanho máximo (em bytes)
08 $tamanhoPermitido = 1024 * 500; // 500 Kb

5 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

09
10 // O nome original do arquivo no computador do usuário
11 $arqName = $_FILES['arquivo']['name'];
12 // O tipo mime do arquivo. Um exemplo pode ser "image/gif"
13 $arqType = $_FILES['arquivo']['type'];
14 // O tamanho, em bytes, do arquivo
15 $arqSize = $_FILES['arquivo']['size'];
16 // O nome temporário do arquivo, como foi guardado no servidor
17 $arqTemp = $_FILES['arquivo']['tmp_name'];
18 // O código de erro associado a este upload de arquivo
19 $arqError = $_FILES['arquivo']['error'];
20
21 if ($arqError == 0) {
22 // Verifica o tipo de arquivo enviado
23 if (array_search($arqType, $tiposPermitidos) === false) {
24 echo 'O tipo de arquivo enviado é inválido!';
25 // Verifica o tamanho do arquivo enviado
26 } else if ($arqSize > $tamanhoPermitido) {
27 echo 'O tamanho do arquivo enviado é maior que o limite!';
28 // Não houveram erros, move o arquivo
29 } else {
30 $pasta = '/uploads/';
31 // Pega a extensão do arquivo enviado
32 $extensao = strtolower(end(explode('.', $arqName)));
33 // Define o novo nome do arquivo usando um UNIX TIMESTAMP
34 $nome = time() . '.' . $extensao;
35
36 // Escapa os caracteres protegidos do MySQL (para o nome do usuário)
37 $nomeMySQL = mysql_real_escape_string($_POST['nome']);
38
39 $upload = move_uploaded_file($arqTemp, $pasta . $nome);
40
41 // Verifica se o arquivo foi movido com sucesso
42 if ($upload == true) {
43 // Cria uma query MySQL
44 $sql = "INSERT INTO `contas` (`id`, `nome`, `foto`) VALUES (NULL, '". $nomeMySQL ."', '". $nome
."')";
45 // Executa a consulta
46 $query = mysql_query($sql);
47
48 if ($query == true) {
49 echo 'Usuário inserido com sucesso!';
50 }
51 }
52 }
53 } else {
54 echo 'Ocorreu algum erro com o upload, por favor tente novamente!';
55 }
56
57 ?>

Espero que tenham gostado e entendido!

Você também vai gostar de ler:


Upload de arquivos com PHP
Como criar um Sistema de Login com Níveis de Permissão
Manipulando dados do MySQL com o PHP

6 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

Criando um sistema de login com PHP e MySQL


Sistema de busca em PHP e MySQL com paginação

Sobre Thiago Belem


Desenvolvedor PHP (profissionalmente) e Freelancer nas horas vagas. Trabalha na Funarte como Desenvolvedor e cria sites e
sistemas usando - basicamente - PHP, MySQL, (X)HTML e CSS. Também domina os frameworks CakePHP (PHP) e jQuery (JS).
Ver todos posts de Thiago Belem →

Esta entrada foi publicada em Artigos, MySQL, PHP, Tutoriais e marcada com a tag API, Banco de Dados, Código, Conexão, Erros, File, Formulário, HTML, INSERT,
Manipulação, MySQL, PHP, PNG, Rede Social, Scripts, Search, Servidor, SQL, Submit, Upload, Validação, Variáveis. Adicione o link permanenteaos seus favoritos.

1 person liked this.

Adicionar novo comentário

Opcional: Conecte-se abaixo.

Mostrando 20 de 54 comentários

Ordenar por: Notificar por email Assinar via RSS

cara como que faz pra quando alguém mandar uma foto ela ir pro meu e-mail???

1 person liked this.

@Pablo
Quando a pessoa fizer o upload envie o link do arquivo para o seu e-mail.

alguem pode solucionar este problema?


CREATE TABLE `area_data` (
`id` int( 11 ) NOT NULL ,
`name` varchar( 100 ) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL ,
`superarea` int( 11 ) NOT NULL ,
`maps` blob( 50000 ) NOT NULL DEFAULT '0',
KEY `id` ( `id` )
) ENGINE = MYISAM DEFAULT CHARSET = latin1;

Mensagens do MySQL : Documentação


#1101 - BLOB/TEXT column 'maps' can't have a default value

O erro anterior era por que eu usava o comando VARCHAR , e então me recomendaram blob, mas agora onde estou errando?

7 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

Coluna blob não pode ter valor padrão

Muito bom !!!

Thiago, criei um sistema de upload múltiplo, mas após começar a usar criptografia md5 nos títulos, todas imagens upadas ficam iguais a primeira selecionada.

Segue meu script:


include 'config.php';

if ( !isset($_SESSION["Username"]) ) {
header("location: loginform.php");
exit;
}

if(isset($_POST['upload'])){
$pasta = 'images_files/';
foreach($_FILES["img"]["error"] as $key => $error){

if($error == UPLOAD_ERR_OK){
$tmp_name = $_FILES["img"]["tmp_name"][$key];
$cod = date('dmy') . '‐' . $_FILES["img"]["name"][$key];
$nome = $_FILES["img"]["name"][$key];
$uploadfile = $pasta . basename($nome);
$Tags = $_POST[Tags];

// Pega a extensão do arquivo enviado

$extensao = strtolower(end(explode('.', $cod)));

// Define o novo nome do arquivo usando um UNIX TIMESTAMP

$nome = md5(time()) . '.' . $extensao;

if(move_uploaded_file($tmp_name, $pasta . $nome)){

$inserir = mysql_query("INSERT INTO images (ImageID, Cid, Sid, Title, Tags, Image, Viewed, Published, TimeStamp, Username,
Email_Address) VALUES ('', '', '', '', '$Tags', '$nome', '', 'Yes', '', '$_SESSION[Username]', '$_SESSION[Email_Address]')");

header("location:myimages.php");

} } } } ?>
Pode me ajudar?

Abs.

Você está usando o time() e todos os uploads acontecem no mesmo segundo, resultado: MD5s iguais.

Use uniqid() no lugar do time.

8 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

PQP, cara, vc é phoda!! Me salvou diversas vezes UAHUHAUHAUAHU


Continue com este trabalho magnífico.

Abs.

Parabém Thiago, ótimo artigo, não achei em nenhum lugar igual ao seu, e além de funcionar direitinho, aprendi a fazer também, Obrigado :D

Muito bem explicado o tutorial. Parabéns!

Olá Tiago tuido bom?


Tenho um blog e gostaria de saber se eu posso fazer uma página de uplod de fotos que seriam enviadas para uma outra página tipo "galeria?
Meu blog é no Blogspot.
Seu blog é muito bom parabéns!
abs.

@Lisete
Provavelmente você vai conseguir essa resposta na página de ajuda do Blogger.

Olá Thiago...

Está dando um erro que eu não encontro solução...

Warning: move_uploaded_file(../uploads/lista.csv) [function.move-uploaded-file]: failed to open stream: No such file or directory in C:\xampp\htdocs\UPLOAD\recebe.php on
line 32

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\xampp\tmp\php662.tmp' to '../uploads/lista.csv' in C:\xampp\htdocs\UPLOAD\recebe.php


on line 32

Você pode olhar?


Obrigado!

@Zucolli
O script não conseguiu localizar o diretório onde irá salvar o arquivo, verifique se você definiu o caminho corretamente e se ele existe.

Esse método também pode ser adaptado para envio de arquivo tipo "*.jar" (formato Java)?

Tem tutorial para fazer o download também, para puxar os arquivos postado na pasta "uploads"?

9 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

Olá Thiago...

Em primeiro lugar parabéns pelo tutorial.


Estou utilizando sua dica pra fazer o upload de um mp3.
Quando dou o comando print_r() antes do if, meu vetor está retornando assim: Array() e consequentemente dá erro na comparação do MiME.
Acontece que já olhei o name do input file e está correto. O que pode ser?

Grato,

Vlw ae Thiago !

to dando uma estuda aew !

Abraço

Continua movendo só o segundo arquivo..

e se eu inserir só o primeiro arquivo no 1 input ele da aquele erro:

"Ocorreu algum erro com o upload, por favor tente novamente!"

e seu inserir só o segundo, da tudo certo..

oq pode ser??

@Matheus
Dá uma estudada melhor em "estruturas de repetição", "multiplos uploads" no PHP... Eu posso ficar a tarde toda aqui tentando te explicar mas é uma coisa q vc precisa
entender antes de fazer.

Qualquer duvida é so falar... Abraços

Deu certo!!

Inseriu os dois nomes dos arquivos no banco,


mas só moveu o segundo arquivo pra pasta upload..

oq pode ser??

Trackbacks

URL de Trackback

Como criar um Sistema de Login com Níveis de Permissão - PHP e MySQL | Thiago Belem / Blog
07/29/2009 12:59 AM
[...] artigo explicando como se faz um sistema de login passo-a-passo, que nem eu fiz o tutorial sobre como funciona ...

blog comments powered by DISQUS

10 de 11 8/11/2010 14:56
Upload de Arquivos – Como tudo funciona | Thiago Belem / Blog http://blog.thiagobelem.net/mysql/upload-de-arquivos-como-tudo-funciona/

Thiago Belem / Blog


Orgulhosamente criado com WordPress.

11 de 11 8/11/2010 14:56