Como tratar arquivos com letras maiúsculas e minúsculas em PHP (exemplo de case insensitive)

Hoje vou mostrar como tratar nomes de arquivos em PHP utilizando Apache sem alterar nas configurações internas.

Recentemente em um cliente, tive que tratar dinamicamente nomes de fotos de produtos através de um WebService com Protheus. Acontece que, quando é uma hospedagem com Windows, não tem diferença se a foto se chama daniel.jpg ou Daniel.jpg.

Já em hospedagens com Linux, existe esta distinção. Para tratar isso, é bem simples, basta alterar as chaves CheckCaseOnly e CheckSpelling do Apache (documentação disponível em https://httpd.apache.org/docs/2.4/mod/mod_speling.html ), e depois reiniciar o serviço httpd.

Porém nesse cliente, era uma hospedagem compartilhada da Locaweb, e dessa forma eles não podiam fazer a alteração. Então como foi tratado na aplicação?

Simples, onde tinha a informação do nome da imagem foi tratado via código fonte, conforme exemplo abaixo:

/* Foto do produto, em caso de ter letra no arquivo, exemplo 4138K.jpg ou 4138k.jpg */

//Primeiro retira retira letras do codigo do produto
$charactersAlpha = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
$codeWithoutAlpha = str_replace($charactersAlpha, "", strtoupper($codeOriginal));

//Se o codigo sem alfabeto for diferente do codigo original, entao significa que tem letras no codigo
if ($codeWithoutAlpha != $codeOriginal) {
//Pega o caminho full da hospedagem, incrmentando com a pasta de produtos
$fullFile = $_SERVER['DOCUMENT_ROOT'] . 'produtos/';

//Testando se a foto e tudo minuscula, por exemplo 4138k.jpg
if (file_exists($fullFile . strtolower($codeOriginal) . '.jpg')) {
$photo = strtolower($codeOriginal) . '.jpg';
}

//Testando se a foto e tudo maiuscula, por exemplo 4138K.jpg
elseif (file_exists($fullFile . strtoupper($codeOriginal) . '.jpg')) {
$photo = strtoupper($codeOriginal) . '.jpg';
}

//Testando se a foto e tudo minuscula mas com extensao maiuscula, por exemplo 4138k.JPG
elseif (file_exists($fullFile . strtolower($codeOriginal) . '.JPG')) {
$photo = strtolower($codeOriginal) . '.JPG';
}

//Testando se a foto e tudo maiuscula inclusive a extensao, por exemplo 4138K.JPG
elseif (file_exists($fullFile . strtoupper($codeOriginal) . '.JPG')) {
$photo = strtoupper($codeOriginal) . '.JPG';
}

//Se nenhum dos testes anteriores deu certo
else {
//echo '<script>alert("foi feito teste com: \n' . $fullFile . strtolower($codeOriginal) . '.jpg' . '\n' . $fullFile . strtoupper($codeOriginal) . '.jpg' . '")</script>';
}
}

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta