Ao trabalhar com upload de arquivos em PHP, é muito comum enfrentar problemas com nomes contendo acentos, espaços e caracteres especiais. Isso pode gerar inconsistências em URLs, falhas em integrações e até erros no sistema operacional. Neste post, você vai aprender como padronizar nomes de arquivos de forma segura e reutilizável.
O Problema
Arquivos enviados por usuários geralmente vêm com nomes como:
- Relatório de Férias 2024.PDF
- Comprovante João (Final).jpg
- Planilha#Financeira!.xlsx
Esses formatos podem causar:
- Problemas em URLs (encoding)
- Incompatibilidade entre sistemas
- Dificuldade de organização e versionamento
A Solução
A função abaixo resolve esses problemas ao normalizar o nome do arquivo:
- Remove acentos
- Substitui caracteres especiais por hífen
- Padroniza para minúsculo
- Mantém a extensão original
- Permite adicionar timestamp e sigla
Função completa
/**
* Trata o nome do arquivo removendo acentos e caracteres especiais,
* mantendo a extensão e permitindo sufixos.
*/
function tratarNomeArquivo(string $string, bool $includeTime = false, string $sigla = ''): string
{
$pathInfo = pathinfo($string);
$nome = $pathInfo['filename'];
$extensao = isset($pathInfo['extension']) ? $pathInfo['extension'] : '';
$nome = trim($nome);
$nome = mb_strtolower($nome, "UTF-8");
$acentos = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýýþÿŔŕ';
$semAcento = 'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuuyybyRr';
$nome = strtr(utf8_decode($nome), utf8_decode($acentos), $semAcento);
$nome = utf8_encode($nome);
$nome = str_replace(".", "", $nome);
$nome = preg_replace("/[^0-9a-z]+/", '-', $nome);
$nome = trim($nome, '-');
if ($includeTime) {
$nome .= "_" . time();
}
if (!empty($sigla)) {
$nome .= "_" . trim($sigla);
}
$nomeFinal = !empty($extensao) ? $nome . "." . strtolower($extensao) : $nome;
return $nomeFinal;
}
Exemplos de Uso
Nome simples
echo tratarNomeArquivo("Relatório de Férias 2024.PDF");
Resultado: relatorio-de-ferias-2024.pdf
Com timestamp
echo tratarNomeArquivo("Relatório de Férias 2024.PDF", true);
Resultado: relatorio-de-ferias-2024_1712584800.pdf
Com sigla
echo tratarNomeArquivo("Relatório de Férias 2024.PDF", false, "RH");
Resultado: relatorio-de-ferias-2024_RH.pdf
Completo (timestamp + sigla)
echo tratarNomeArquivo("Relatório de Férias 2024.PDF", true, "RH");
Resultado: relatorio-de-ferias-2024_1712584800_RH.pdf
Arquivo com caracteres especiais
echo tratarNomeArquivo("Comprovante João (Final).jpg");
Resultado: comprovante-joao-final.jpg
Sem extensão
echo tratarNomeArquivo("arquivo_teste");
Resultado: arquivo-teste
Uso em upload
$nomeOriginal = $_FILES['arquivo']['name'];
$nomeTratado = tratarNomeArquivo($nomeOriginal, true, "USR");
move_uploaded_file($_FILES['arquivo']['tmp_name'], "uploads/" . $nomeTratado);
Conclusão
Padronizar nomes de arquivos é essencial para evitar problemas técnicos e manter consistência no sistema. Essa função oferece uma solução simples, eficiente e reutilizável para qualquer projeto PHP.
Além disso, com o uso de timestamp e siglas, você ganha rastreabilidade e controle de versões sem depender de hash.