{"id":2789,"date":"2014-07-31T03:18:41","date_gmt":"2014-07-31T03:18:41","guid":{"rendered":"http:\/\/www.deuzebranaweb.com.br\/?p=2789"},"modified":"2014-07-31T03:18:41","modified_gmt":"2014-07-31T03:18:41","slug":"upload-de-arquivos-com-php","status":"publish","type":"post","link":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/2014\/07\/31\/upload-de-arquivos-com-php\/","title":{"rendered":"Upload de arquivos com PHP"},"content":{"rendered":"<p>Quem nunca precisou fazer um site que tenha upload de algum tipo de arquivo que atire a primeira pedra!<\/p>\n<p>E hoje, voc\u00ea que n\u00e3o atirou a pedra, vai poder fazer o seu upload de arquivos \u2013 com valida\u00e7\u00e3o e filtro de extens\u00f5es e tamanho de arquivo \u2013 com o PHP!  \ud83d\ude09<\/p>\n<p>Vamos ao que interessa:<\/p>\n<p>Voc\u00ea vai precisar, basicamente, de duas coisas: um formul\u00e1rio pro usu\u00e1rio escolher o arquivo e um arquivo .php para receber os dados e salvar (ou n\u00e3o) o arquivo enviado numa pasta escolhida. Vou ensinar tamb\u00e9m a fazer um script que filtre a extens\u00e3o do tipo de arquivo enviado e o tamanho dele.<\/p>\n<p>Duas coisas que voc\u00ea precisa saber antes de criar o seu script de upload e pensar que ele ir\u00e1 funcionar:<\/p>\n<p>No PHP com configura\u00e7\u00e3o padr\u00e3o o limite de uploads \u00e9 de 2Mb ent\u00e3o, teste com arquivos menores.<br \/>\nEm alguns servidores para voc\u00ea poder salvar um arquivo em uma pasta voc\u00ea precisa de permiss\u00e3o de usu\u00e1rio (tamb\u00e9m conhecido como CHMOD), \u00e9 raro precisar configurar isso, mas se por obra divina o seu arquivo n\u00e3o estiver indo pra pasta que voc\u00ea definiu, tente \u201cdar um CHMOD 777\u201d na pasta de destino.<br \/>\nSe voc\u00ea estiver testando seu script localmente, pode ignorar a segunda considera\u00e7\u00e3o e s\u00f3 se preocupar em enviar arquivos menores que 2Mb para testar a aplica\u00e7\u00e3o.<\/p>\n<p>Vamos ao formul\u00e1rio HTML para o usu\u00e1rio escolher o arquivo a ser enviado:<\/p>\n<p>1<\/p>\n<form method=\"post\" action=\"\/recebe_upload.php\" enctype=\"multipart\/form-data\">\n2<br \/>\n<label>Arquivo<\/label><br \/>\n3<br \/>\n<input type=\"file\" name=\"arquivo\" \/><br \/>\n4<br \/>\n<input type=\"submit\" value=\"Enviar\" \/><br \/>\n5<br \/>\n<\/form>\n<p>Salve este HTML dentro de arquivo com o nome que preferir.<\/p>\n<p>Agora vamos criar o arquivo que ir\u00e1 receber os dados e cuidar de tudo pra voc\u00ea\u2026 Salve-o como recebe_upload.php:<\/p>\n<p>01<br \/>\n< ?php\n02\n \n03\n\/\/ Pasta onde o arquivo vai ser salvo\n04\n$_UP['pasta'] = 'uploads\/';\n05\n \n06\n\/\/ Tamanho m\u00e1ximo do arquivo (em Bytes)\n07\n$_UP['tamanho'] = 1024 * 1024 * 2; \/\/ 2Mb\n08\n \n09\n\/\/ Array com as extens\u00f5es permitidas\n10\n$_UP['extensoes'] = array('jpg', 'png', 'gif');\n11\n \n12\n\/\/ Renomeia o arquivo? (Se true, o arquivo ser\u00e1 salvo como .jpg e um nome \u00fanico)\n13\n$_UP['renomeia'] = false;\n14\n \n15\n\/\/ Array com os tipos de erros de upload do PHP\n16\n$_UP['erros'][0] = 'N\u00e3o houve erro';\n17\n$_UP['erros'][1] = 'O arquivo no upload \u00e9 maior do que o limite do PHP';\n18\n$_UP['erros'][2] = 'O arquivo ultrapassa o limite de tamanho especifiado no HTML';\n19\n$_UP['erros'][3] = 'O upload do arquivo foi feito parcialmente';\n20\n$_UP['erros'][4] = 'N\u00e3o foi feito o upload do arquivo';\n21\n \n22\n\/\/ Verifica se houve algum erro com o upload. Se sim, exibe a mensagem do erro\n23\nif ($_FILES['arquivo']['error'] != 0) {\n24\ndie(\"N\u00e3o foi poss\u00edvel fazer o upload, erro:<br \/>&#8221; . $_UP[&#8216;erros&#8217;][$_FILES[&#8216;arquivo&#8217;][&#8216;error&#8217;]]);<br \/>\n25<br \/>\nexit; \/\/ Para a execu\u00e7\u00e3o do script<br \/>\n26<br \/>\n}<br \/>\n27<\/p>\n<p>28<br \/>\n\/\/ Caso script chegue a esse ponto, n\u00e3o houve erro com o upload e o PHP pode continuar<br \/>\n29<\/p>\n<p>30<br \/>\n\/\/ Faz a verifica\u00e7\u00e3o da extens\u00e3o do arquivo<br \/>\n31<br \/>\n$extensao = strtolower(end(explode(&#8216;.&#8217;, $_FILES[&#8216;arquivo&#8217;][&#8216;name&#8217;])));<br \/>\n32<br \/>\nif (array_search($extensao, $_UP[&#8216;extensoes&#8217;]) === false) {<br \/>\n33<br \/>\necho &#8220;Por favor, envie arquivos com as seguintes extens\u00f5es: jpg, png ou gif&#8221;;<br \/>\n34<br \/>\n}<br \/>\n35<\/p>\n<p>36<br \/>\n\/\/ Faz a verifica\u00e7\u00e3o do tamanho do arquivo<br \/>\n37<br \/>\nelse if ($_UP[&#8216;tamanho&#8217;] < $_FILES['arquivo']['size']) {\n38\necho \"O arquivo enviado \u00e9 muito grande, envie arquivos de at\u00e9 2Mb.\";\n39\n}\n40\n \n41\n\/\/ O arquivo passou em todas as verifica\u00e7\u00f5es, hora de tentar mov\u00ea-lo para a pasta\n42\nelse {\n43\n\/\/ Primeiro verifica se deve trocar o nome do arquivo\n44\nif ($_UP['renomeia'] == true) {\n45\n\/\/ Cria um nome baseado no UNIX TIMESTAMP atual e com extens\u00e3o .jpg\n46\n$nome_final = time().'.jpg';\n47\n} else {\n48\n\/\/ Mant\u00e9m o nome original do arquivo\n49\n$nome_final = $_FILES['arquivo']['name'];\n50\n}\n51\n \n52\n\/\/ Depois verifica se \u00e9 poss\u00edvel mover o arquivo para a pasta escolhida\n53\nif (move_uploaded_file($_FILES['arquivo']['tmp_name'], $_UP['pasta'] . $nome_final)) {\n54\n\/\/ Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo\n55\necho \"Upload efetuado com sucesso!\";\n56\necho '<br \/><a href=\"\/&#039;%20.%20$_UP%5B&#039;pasta&#039;%5D%20.%20$nome_final%20.%20&#039;\">Clique aqui para acessar o arquivo<\/a>&#8216;;<br \/>\n57<br \/>\n} else {<br \/>\n58<br \/>\n\/\/ N\u00e3o foi poss\u00edvel fazer o upload, provavelmente a pasta est\u00e1 incorreta<br \/>\n59<br \/>\necho &#8220;N\u00e3o foi poss\u00edvel enviar o arquivo, tente novamente&#8221;;<br \/>\n60<br \/>\n}<br \/>\n61<\/p>\n<p>62<br \/>\n}<br \/>\n63<\/p>\n<p>64<br \/>\n?><br \/>\nCom isso voc\u00ea j\u00e1 tem um script que recebe os dados enviados pelo formul\u00e1rio e que coloca (ou n\u00e3o) o arquivo na pasta.<\/p>\n<p>Eu sei que esse script pode parecer um pouco avan\u00e7ado pra quem t\u00e1 come\u00e7ando, mas eu preferi fazer o \u201cb\u00e1sico que todo mundo procura\u201d. Tentei colocar o m\u00e1ximo de coment\u00e1rios e fazer uma sintaxe mais clara o poss\u00edvel pra que voc\u00eas entendam.<\/p>\n<p>A parte que realmente faz o \u201cupload\u201d \u00e9 apenas o comando da linha 53 que \u00e9 o move_uploaded_file(). Vou explicar o nome e o uso dele:<\/p>\n<p>Quando voc\u00ea envia um arquivo por um formul\u00e1rio para o PHP ele vai direto para uma pasta tempor\u00e1ria usando um nome \u00fanico e extens\u00e3o .tmp (d\u00ea uma olhada no valor da vari\u00e1vel $_FILES[&#8216;arquivo&#8217;][&#8216;tmp_name&#8217;]). Esse comando move o arquivo dessa pasta para a pasta que voc\u00ea escolheu.<\/p>\n<p>Sei que essa parte do PHP (upload de arquivos) \u00e9 uma das coisas que mais d\u00e1 problema por a\u00ed devido as diferentes configura\u00e7\u00f5es de servidores\u2026 Ent\u00e3o qualquer d\u00favida \u00e9 s\u00f3 deixar um coment\u00e1rio que eu tento te ajudar.<\/p>\n<p>Outra coisa importante que eu provavelmente n\u00e3o disse aqui no blog ainda: pra qualquer coisa no PHP existem, no m\u00ednimo, tr\u00eas formas de se alcan\u00e7ar o mesmo objetivo. Ent\u00e3o n\u00e3o quero que encarem os meus scripts como a verdade absoluta. Eles s\u00e3o s\u00f3 um exemplo de um script eficiente e customiz\u00e1vel baseado na minha experi\u00eancia.<\/p>\n<p>Espero que tenham gostado!<\/p>\n<p>Documenta\u00e7\u00e3o Oficial:<\/p>\n<p>Fun\u00e7\u00e3o move_uploaded_file() \u00bb Move um arquivo que foi enviado para o servidor<br \/>\nFun\u00e7\u00e3o time() \u00bb Retorna o UNIX TIMESTAMP atual<br \/>\nFun\u00e7\u00e3o strtolower() \u00bb Altera uma string para ficar com as letras min\u00fasculas<br \/>\nFun\u00e7\u00e3o array_search() \u00bb Faz uma busca entre os elementos do array<\/p>\n<p>http:\/\/blog.thiagobelem.net\/upload-de-arquivos-com-php\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quem nunca precisou fazer um site que tenha upload de algum tipo de arquivo que atire a primeira pedra! E hoje, voc\u00ea que n\u00e3o atirou a pedra, vai poder fazer o seu upload de arquivos \u2013 com valida\u00e7\u00e3o e filtro de extens\u00f5es e tamanho de&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_angie_page":false,"page_builder":"","footnotes":""},"categories":[6],"tags":[],"class_list":["post-2789","post","type-post","status-publish","format-standard","hentry","category-php"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2789","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=2789"}],"version-history":[{"count":0,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2789\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=2789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=2789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=2789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}