PHP

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
?>

13 thoughts on “Upload de arquivos com PHP

  • Daniel

    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
    • Fala Daniel.

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

      Resposta
  • José

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

    Resposta
    • 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
  • Gustavo Freire

    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
    • 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
      • Gustavo Freire

        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
        • Fala Gustavo.

          Poderia informar se aparece alguma mensagem de erro.

          Resposta
  • Ricardo

    Os alertas não estão aparecendo

    Resposta
  • Rodrigo Gomes

    bom dia.
    como posso fazer o mesmo upload mas para uma pasta de rede interna?
    quando faço o codigo para dentro da unidade C: dá ceto porém na pasta de um servidor de rede aparece o erro abaixo:

    Warning: move_uploaded_file(C:\xampp\htdocs\engenhariaU:\teste/CANÁRIO 120 (P-53)/002.jpg): failed to open stream: No such file or directory in C:\xampp\htdocs\engenharia\Painel\pages\cadastro_desenho.php on line 24

    Warning: move_uploaded_file(): Unable to move ‘C:\xampp\tmp\php19A2.tmp’ to ‘C:\xampp\htdocs\engenhariaU:\teste/CANÁRIO 120 (P-53)/002.jpg’ in C:\xampp\htdocs\engenharia\Painel\pages\cadastro_desenho.php on line 24

    Resposta
    • Bom dia Rodrigo,

      pelo que entendi, você está enviando o arquivo para a unidade de rede U:

      Tem um erro aqui C:\xampp\htdocs\engenhariaU:\teste/CANÁRIO 120 (P-53)/002.jpg

      Resposta
  • Henrique

    Bom Dia, sou novo como programador e estou utiizando este método para fazer upload de arquivo, mas não entou conseguindo fazer o Upload do arquivo não sei por qual motivo.
    Todos os teste de falha deram, tanto tamanho, tipo de arquivo e todos dão certo mas o de sucesso não estou conseguindo.

    Resposta
    • Henrique,

      você vai ter que depurar seu código.

      Faz um teste. Após esta linha:
      // faz o upload
      $enviou = move_uploaded_file($_FILES[‘arquivo’][‘tmp_name’], $diretorio.$novo_nome);

      coloque
      var_dump($enviou);
      exit();

      e veja o que retorna.

      Resposta

Deixe um comentário

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