Академический Документы
Профессиональный Документы
Культура Документы
net/mysql/upload-de-arquivos-como-tudo-funciona/
ClubeUrbano.GROUPON.com.br/Academia PeixeUrbano.com.br/Cadastre-se
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.
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:
É um formulário simples, com dois campos e um submit… O que importa nesse formulário são três coisas:
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.
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.
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.
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.
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.
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.
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 ?>
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.
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 ?>
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/
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.
Mostrando 20 de 54 comentários
cara como que faz pra quando alguém mandar uma foto ela ir pro meu e-mail???
@Pablo
Quando a pessoa fizer o upload envie o link do arquivo para o seu e-mail.
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/
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.
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];
$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.
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/
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
@Lisete
Provavelmente você vai conseguir essa resposta na página de ajuda do Blogger.
Olá Thiago...
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
@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...
Grato,
Vlw ae Thiago !
Abraço
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.
Deu certo!!
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 ...
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/
11 de 11 8/11/2010 14:56