Upload de arquivos com PHP

Neste post vamos aprender como fazer upload de arquivos com PHP.

No código abaixo você terá a possibilidade de validar a extensão, tamanho e renomear o arquivo – só serão permitidos arquivos PDF. Para permitir outros arquivos, basta mudar esta linha if( in_array( $extensao, array(“pdf”) ) ) para algo do tipo if( in_array( $extensao, array(‘jpg’, ‘jpeg’, ‘gif’, ‘png’) ) ).

O código está todo comentado e de fácil entendimento.

index.php

<!DOCTYPE html>
<html lang="pt-br">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Upload de arquivos com PHP</title>
 
    <!-- CDN Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
        integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
        crossorigin="anonymous">
    </head>
    <body>
      <div class="container">
        <h1 class="text-center">Formulário de Upload de Arquivos</h1>
        <?php if ($msg != false) echo "<div class=\"alert $class\" role=\"alert\">$msg</div>"; ?>
 
        <form name="form" action="" method="post" enctype="multipart/form-data">
           <input type="hidden" name="enviou" value="1">
           Arquivo PDF:<br>
           <input type="file" name="arquivo">
           <br><br>
           <input type="submit" class="btn btn-primary" value="Enviar">
        </form>
      </div>
    </body>
</html>
<?php 
include "funcoes.php";
 
$msg = false;
 
if( isset($_POST['enviou']) && $_POST['enviou'] == 1 ){
 
    // arquivo
	$arquivo = $_FILES['arquivo'];
 
    // Tamanho máximo do arquivo (em Bytes)
    $tamanhoPermitido = 1024 * 1024 * 2; // 2Mb
 
    //Define o diretorio para onde enviaremos o arquivo
    $diretorio = "uploads/";
 
    // verifica se arquivo foi enviado e sem erros
    if( $arquivo['error'] == UPLOAD_ERR_OK ){
 
        // pego a extensão do arquivo
        $extensao = extensao($arquivo['name']);
 
        // valida a extensão
        if( in_array( $extensao, array("pdf") ) ){
 
            // verifica tamanho do arquivo
            if ( $arquivo['size'] > $tamanhoPermitido ){
 
                $msg = "<strong>Aviso!</strong> O arquivo enviado é muito grande, envie arquivos de até ".$tamanhoPermitido/MB." MB.";
                $class = "alert-warning";
 
            }else{
 
                // atribui novo nome ao arquivo
                $novo_nome  = md5(time()).".".$extensao;
 
                // faz o upload
                $enviou = move_uploaded_file($_FILES['arquivo']['tmp_name'], $diretorio.$novo_nome);
 
                if($enviou){
                    $msg = "<strong>Sucesso!</strong> Arquivo enviado corretamente.";
                    $class = "alert-success";
                }else{
                    $msg = "<strong>Erro!</strong> Falha ao enviar o arquivo.";
                    $class = "alert-danger";
                }
            }
 
        }else{
            $msg = "<strong>Erro!</strong> Somente arquivos PDF são permitidos.";
            $class = "alert-danger";
        }
 
    }else{
        $msg = "<strong>Atenção!</strong> Você deve enviar um arquivo.";
        $class = "alert-info";
    }
}
?>

funcoes.php

<?php
function extensao($arquivo){
    $arquivo = strtolower($arquivo);
    $explode = explode(".", $arquivo);
    $arquivo = end($explode);
 
    return ($arquivo);
}
 
define('KB', 1024);
define('MB', 1048576); // 1024 * 1024
define('GB', 1073741824); // 1024 * 1024 * 1024
define('TB', 1099511627776); // 1024 * 1024 * 1024 * 1024
?>

8 comentários em “Upload de arquivos com PHP

  • 15 de agosto de 2017 em 2:02
    Permalink

    Olá Tiago,
    Estou tentando fazer com que o arquivo seja anexado para ser enviado para um e-mail, mas não estou conseguindo. Teria como me dar um auxílio?
    Grato.

    Resposta
    • 22 de novembro de 2017 em 9:26
      Permalink

      Fala Daniel.

      Já escrevi um post falando sobre isso e que pode te ajudar. Clique aqui para acessar.

      Resposta
  • 20 de novembro de 2017 em 12:43
    Permalink

    Bom dia.
    Coloco os dois primeiros arquivos com que nome?
    Obrigado

    Resposta
    • 22 de novembro de 2017 em 9:19
      Permalink

      Fala José.

      Eu dividi o código, mas você pode colocar tudo dentro do arquivo index.php.

      O segundo bloco que contém o código PHP, você coloca antes da tag </body>.

      Resposta
  • 27 de novembro de 2017 em 15:45
    Permalink

    Boa tarde Tiago, tudo bem?

    Gostaria de saber se há possibilidade do nome do arquivo ser igual ao do nome informado no preenchimento do formulário, pois tenho um formulário que receberá os dados atualizados dos funcionários e os mesmos irão adicionar os docs, mas na pasta ele grava com nome aleatório, e no caso são 460 funcionários rsrs

    Obrigado desde já!

    Resposta
    • 27 de novembro de 2017 em 16:16
      Permalink

      Fala Gustavo.

      É bem simples. Vou te dar um exemplo:

      // simulando que você possui um campo  e que o método do form seja POST
      // atribui o valor a uma variável
      $nome_funcionario = $_POST['nome_funcionario'];
      
      $novo_nome  = $nome_funcionario.".".$extensao;
      
      
      Se precisar tratar o nome do funcionário, removendo espaços, acentos e acrescentando hífen (-), veja este post https://www.linhadecomando.com/php/php-funcao-para-tratar-nome-de-um-arquivo-na-hora-de-fazer-upload que ensino como fazer.
      Resposta
      • 28 de novembro de 2017 em 9:56
        Permalink

        Obrigado pelo feedback Tiago.

        Estou com um problema: ao enviar o formulário, ele grava no BD as infos mas não sobe o pdf pra pasta. Estou usando fieldset e dentro dele por exemplo:

        Nome:

        Fiz o teste para o “Enviar Arquivo”, gravou no BD todas infos mas não subiu pra pasta o PDF.
        OBS: coloquei o PHP antes do e subi tb o funcoes.php pro servidor.

        Segue o campo Enviar Arquivos:


        Arquivo PDF:

        Obrigado pela atenção

        Resposta
        • 3 de dezembro de 2017 em 8:32
          Permalink

          Fala Gustavo.

          Poderia informar se aparece alguma mensagem de erro.

          Resposta

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *