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
🎯 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.

%20-%20Copia.png)
.png)
.png)
.png)
Postar um comentário