Upload, Imagens e Manipulação de Arquivos no PHP 🐘 Etapa 12

 Seja muito bem-vindo à Academy Code Christ!


🌍 Academy Code Christ está disponível em vários idiomas.
Fique à vontade para usar o tradutor na Barra lateral (Sidebar) e aprender no seu idioma.

 PHP 🐘 Etapa 12
Upload, Imagens e Manipulação



📚 Continue sua jornada de aprendizado


A Academy Code Christ oferece trilhas de aprendizado em diferentes tecnologias. Explore os cursos, acompanhe as aulas e avance em sua jornada de conhecimento acessando os menus correspondentes:



💻 Pratique o que você aprende


🎯 Por que Trabalhar com Uploads


A web moderna gira em torno de arquivos compartilhados — fotos de perfil, comprovantes, relatórios, currículos, documentos PDF.


 Saber enviar e armazenar esses arquivos de forma segura e organizada é fundamental.
 O PHP oferece ferramentas poderosas para isso, permitindo:


●     Receber arquivos via formulário HTML;

●     Salvar imagens e documentos no servidor;

●     Validar tipos e tamanhos;

●     Tratar nomes e prevenir falhas de segurança;

●     Redimensionar e manipular imagens antes de salvar.


Estrutura Básica de um Upload em PHP


O processo de upload segue cinco etapas:

1.    Criar um formulário HTML do tipo multipart/form-data;

2.    Receber os dados do arquivo via $_FILES;

3.    Validar o arquivo (tipo, tamanho, nome);

4.    Movê-lo para uma pasta destino;

5.    Exibir ou registrar os dados.


Criando o Formulário de Upload


Crie uma pasta uploads/ no seu projeto com permissão de escrita (777 em ambiente local).


<form method="POST" enctype="multipart/form-data" action="upload.php">

  Escolha o arquivo: <input type="file" name="arquivo"><br><br>

  <input type="submit" value="Enviar">

</form>

 

O atributo enctype="multipart/form-data" é obrigatório para formulários que enviam arquivos.


Recebendo o Arquivo e Salvando no Servidor

Crie o arquivo upload.php:

<?php

if (isset($_FILES["arquivo"])) {

    $arquivo = $_FILES["arquivo"];

    $nome = $arquivo["name"];

    $tmp = $arquivo["tmp_name"];

    $tamanho = $arquivo["size"];

    $erro = $arquivo["error"];

 

    if ($erro !== UPLOAD_ERR_OK) {

        die("Erro no upload: $erro");

    }

 

    $destino = "uploads/" . basename($nome);

    if (move_uploaded_file($tmp, $destino)) {

        echo "Upload realizado com sucesso!<br>";

        echo "Arquivo salvo em: $destino";

    } else {

        echo "Erro ao mover arquivo.";

    }

}

?>

 

Ao enviar o arquivo, ele é temporariamente armazenado em uma pasta interna (tmp) até ser movido com move_uploaded_file().


Validando Tipos de Arquivo


Para garantir segurança, nunca aceite qualquer tipo arbitrário.
 Use a função mime_content_type() para verificar o tipo real do arquivo:

$tipo = mime_content_type($tmp);

$permitidos = ["image/jpeg", "image/png", "application/pdf"];

 

if (!in_array($tipo, $permitidos)) {

  die("Tipo de arquivo não permitido.");

}

 

Isso evita que usuários façam upload de scripts maliciosos disfarçados.


Limitando o Tamanho do Arquivo


Podemos bloquear uploads grandes demais:

$tamanhoMax = 2 * 1024 * 1024; // 2MB

if ($tamanho > $tamanhoMax) {

  die("Arquivo excede o limite de 2MB!");

}

 

E também definir o limite global no php.ini:

upload_max_filesize = 2M

post_max_size = 2M

 


Renomeando Arquivos para Evitar Conflitos


Evite sobrescrever arquivos com nomes iguais.
Uma boa prática é gerar um novo nome com timestamp ou identificador único (UUID).

$extensao = pathinfo($nome, PATHINFO_EXTENSION);

$novoNome = uniqid() . "." . $extensao;

$destino = "uploads/" . $novoNome;

 

Dessa forma, mesmo que dois usuários enviem foto.png, os arquivos terão nomes únicos.


Exemplo Completo de Upload com Validação

<?php

if (isset($_FILES["arquivo"])) {

    $arquivo = $_FILES["arquivo"];

    $tmp = $arquivo["tmp_name"];

    $nomeOriginal = $arquivo["name"];

    $tamanho = $arquivo["size"];

    $tipo = mime_content_type($tmp);

    $permitidos = ["image/jpeg", "image/png", "application/pdf"];

 

    if ($arquivo["error"] !== UPLOAD_ERR_OK) {

        die("Erro no upload!");

    }

 

    if (!in_array($tipo, $permitidos)) {

        die("Tipo de arquivo não permitido.");

    }

 

    if ($tamanho > 2 * 1024 * 1024) {

        die("Tamanho máximo de 2MB excedido.");

    }

 

    $ext = pathinfo($nomeOriginal, PATHINFO_EXTENSION);

    $novoNome = uniqid("file_") . "." . $ext;

    $destino = "uploads/" . $novoNome;

 

    if (move_uploaded_file($tmp, $destino)) {

        echo "<h3>Arquivo salvo com sucesso!</h3>";

        echo "<p>Nome: $novoNome<br>Tipo: $tipo<br>Tamanho: $tamanho bytes</p>";

    }

}

?>

 

Agora você tem um upload seguro, validado e funcional.


Integrando Upload com Banco de Dados (MVC)


Podemos gravar no banco o nome do arquivo enviado.

Model (ArquivoModel.php):

class ArquivoModel {

    private $pdo;

    public function __construct($pdo) { $this->pdo = $pdo; }

 

    public function salvar($nome, $caminho) {

        $stmt = $this->pdo->prepare("INSERT INTO arquivos (nome, caminho) VALUES (?, ?)");

        $stmt->execute([$nome, $caminho]);

    }

 

    public function listar() {

        $stmt = $this->pdo->query("SELECT * FROM arquivos");

        return $stmt->fetchAll(PDO::FETCH_ASSOC);

    }

}

 

Controller (ArquivoController.php):

class ArquivoController {

    private $model;

    public function __construct($pdo) {

      $this->model = new ArquivoModel($pdo);

    }

 

    public function upload() {

      if ($_SERVER["REQUEST_METHOD"] == "POST") {

          $arquivo = $_FILES["arquivo"];

          $tmp = $arquivo["tmp_name"];

          $ext = pathinfo($arquivo["name"], PATHINFO_EXTENSION);

          $novoNome = uniqid() . "." . $ext;

          $destino = "uploads/" . $novoNome;

         

          if (move_uploaded_file($tmp, $destino)) {

              $this->model->salvar($novoNome, $destino);

              header("Location: index.php?controller=arquivo&action=listar");

          } else {

              echo "Erro ao mover arquivo.";

          }

      } else {

          require "app/views/arquivo/form.php";

      }

    }

 

    public function listar() {

      $arquivos = $this->model->listar();

      require "app/views/arquivo/listar.php";

    }

}

 

Essa integração mostra o poder do MVC: a View envia, o Controller valida e o Model grava os dados.


Exibindo Imagens Enviadas


Com os arquivos armazenados, podemos listá-los facilmente:

<?php foreach ($arquivos as $a): ?>

  <div>

      <p><?= $a["nome"] ?></p>

      <img src="<?= $a["caminho"] ?>" width="200"><br>

  </div>

<?php endforeach; ?>

 

Com essa simples View, você cria uma galeria dinâmica de imagens carregadas.


Manipulando Imagens (Redimensionar, Miniaturas)


O PHP possui a biblioteca GD para manipular imagens — redimensionar, cortar, adicionar marca d’água etc.

Exemplo: criar uma miniatura automaticamente após upload.

<?php

function criarThumb($origem, $larguraDesejada, $destino) {

    $img = imagecreatefromjpeg($origem);

    $larguraOriginal = imagesx($img);

    $alturaOriginal = imagesy($img);

 

    $alturaDesejada = ($larguraDesejada / $larguraOriginal) * $alturaOriginal;

 

    $thumb = imagecreatetruecolor($larguraDesejada, $alturaDesejada);

    imagecopyresampled($thumb, $img, 0, 0, 0, 0, $larguraDesejada, $alturaDesejada, $larguraOriginal, $alturaOriginal);

    imagejpeg($thumb, $destino, 80);

    imagedestroy($img);

    imagedestroy($thumb);

}

?>

 

Basta chamar:

criarThumb("uploads/foto.jpg", 200, "uploads/thumb_foto.jpg");

 

E o sistema cria automaticamente uma versão reduzida otimizada.


Lidando com Vários Arquivos de Uma Vez


Formulários modernos permitem múltiplos uploads simultâneos.

<form method="POST" enctype="multipart/form-data">

  <input type="file" name="arquivos[]" multiple><br>

  <input type="submit" value="Enviar">

</form>

 

Processamento:

foreach ($_FILES["arquivos"]["tmp_name"] as $chave => $tmp) {

    $nome = $_FILES["arquivos"]["name"][$chave];

    $novo = uniqid()."_".$nome;

    move_uploaded_file($tmp, "uploads/".$novo);

    echo "Arquivo $novo salvo!<br>";

}

 

Simples, prático e eficiente para galerias ou cadastros múltiplos.


Removendo Arquivos do Servidor


Podemos excluir um arquivo com unlink():

$caminho = "uploads/" . $arquivoExcluir;

if (file_exists($caminho)) {

    unlink($caminho);

    echo "Arquivo excluído.";

}

 

Também é comum vincular esse comando ao botão “Excluir” de um painel CMS.


Segurança no Upload


O envio de arquivos é um dos pontos mais sensíveis de um sistema.
 Para manter o ambiente seguro:


1.    Nunca confie no nome do arquivo enviado. Use basename() e renomeie.

2.    Use mime_content_type() e valide as extensões.

3.    Guarde os arquivos fora do diretório público (por exemplo, em uma pasta protegida).

4.    Evite executar arquivos enviados — nunca aceite .php ou .exe.

5.    Controle permissões da pasta uploads/ para evitar acessos indesejados.


A segurança deve vir antes do design.


Conclusão 


Nesta etapa, você aprendeu a dominar upload e manipulação de arquivos no PHP, integrando com seu sistema MVC e banco de dados.

Você viu:

●     Como criar formulários de upload seguros;

●     Como validar tipo e tamanho de arquivos;

●     Como renomear e salvar no servidor;

●     Como integrar com o banco e exibir imagens;

●     Como gerar miniaturas e lidar com múltiplos arquivos;

●     Boas práticas e segurança essencial.


Esse conhecimento é indispensável para qualquer sistema profissional que receba conteúdo do usuário.


🚀 Próximo Passo – Gerando Relatórios, Exportando Dados e PDFs no PHP

Na próxima etapa, você aprenderá a gerar relatórios automáticos, exportar dados em PDF e CSV, e criar visualizações práticas com base nos cadastros armazenados.



Este conteúdo faz parte do Academy Code Christ. 

Um projeto criado para ajudar jovens e iniciantes a aprender programação do zero, de forma simples e gratuita.

Nossa missão é compartilhar conhecimento e incentivar mais pessoas a descobrir que também podem aprender tecnologia, criar projetos e desenvolver novas habilidades.
Todo o conteúdo é disponibilizado gratuitamente, de forma clara, prática e 
sem enrolação. 

Você pode apoiar o projeto se quiser 
com um café. 



Post a Comment

Postagem Anterior Próxima Postagem