quarta-feira, 6 de agosto de 2014

Caminho relativo em PHP (Relative path)

Recentemente precisei fazer uma manipulação de arquivos em um site que hospedo na Locaweb e me deparei com um problema chato: Só tinha os caminhos absolutos dos arquivos e a locaweb não me dava permissão para acessar o meu arquivo via caminho absoluto.

Explicando em miúdos:
Queria simplesmente renomear um arquivo que estava em um caminho parecido com esse aqui:
/home/storage/userxpto/public_html/pastax/pastay/documentos/documento.doc

Acontece que o meu script PHP estava em um caminho como esse aqui:
/home/storage/userxpto/public_html/sistema_xpto/meuscript.php

Ao executar o comando file_exists(/home/storage/userxpto/public_html/pastax/pastay/documentos/documento.doc) do PHP, sempre recebia um erro por falta de permissão. Daí descobri que não conseguia sequer listar o conteúdo da pasta /home/storage na Locaweb (óbvio que por quest~~oes de segurança da própria Locaweb). A solução foi passar o caminho relativo entre o meu script PHP 'meuscript.php' e o documento 'documento.doc' para o comando 'file_exists'.

Como desconheço uma função em PHP que obtenha o caminho relativo entre dois paths, eu precisei implementar a criança.

Segue o código abaixo:

/***
  getRelativePath obtém o caminho relativo entre dois caminhos de diretórios.
    Ex: $path1 = "/a/b/c/d/e/f/g";
          $path2 = "/a/b/c/d/x/y/z";
          echo "Relative = ".getRelative($path1, $path2);
          //Resultado: ..\..\..\x\y\z
*/
function getRelativePath($path1, $path2){
    $p1 = $p2 = "";

    //Obtendo o ponto de diferença entre os paths
    $i=0;
    while($path1[$i] == $path2[$i]) $i++;

    $p1 = substr($path1, $i);
    $p1 = preg_replace("@[^\\\/]+@", "..", $p1);
    $p1 = preg_replace("@[\\\/]@", DIRECTORY_SEPARATOR, $p1);

    $p2 = substr($path2, $i);
    $p2 = preg_replace("@[\\\/]@", DIRECTORY_SEPARATOR, $p2);

    return $p1.DIRECTORY_SEPARATOR.$p2;
}


Espero que seja útil pra mais alguém!

Nenhum comentário:

Postar um comentário