zip = new ZipArchive(); } public function zip($filename, $files) { $res = $this->zip->open($filename, ZipArchive::CREATE); if ($res !== true) { return false; } if (is_array($files)) { foreach ($files as $f) { if (!$this->addFileOrDir($f)) { $this->zip->close(); return false; } } $this->zip->close(); return true; } else { if ($this->addFileOrDir($files)) { $this->zip->close(); return true; } return false; } } public function unzip($filename, $path) { $res = $this->zip->open($filename); if ($res !== true) { return false; } //O comando abaixo faz com que todos os arquivos extraídos pelo comando "extractTo" possuam o privilégio "777". umask(0); if ($this->zip->extractTo($path)) { $this->zip->close(); return true; } return false; } /** * Add file/folder to archive * @param string $filename * @return bool */ private function addFileOrDir($filename) { if (is_file($filename)) { if ($this->zip->addFile($filename)) { //NV43. //$this->zip->setCompressionName($path . '/' . $file,ZipArchive::CM_STORE); return true; } else{ return false; } } elseif (is_dir($filename)) { return $this->addDir($filename); } return false; } /** * Add folder recursively * @param string $path * @return bool */ private function addDir($path) { if (!$this->zip->addEmptyDir($path)) { return false; } $objects = scandir($path); if (is_array($objects)) { foreach ($objects as $file) { if ($file != '.' && $file != '..') { if (is_dir($path . '/' . $file)) { if (!$this->addDir($path . '/' . $file)) { return false; } } elseif (is_file($path . '/' . $file)) { if (!$this->zip->addFile($path . '/' . $file)) { return false; } //Caso perceba que os arquivos zip estão demorando muito para serem gerados, descomente a linha abaixo em todos os locais que aparece nesse código pois dessa forma o arquivo não será comprimido, o conteúdo será apenas juntado no arquivo zip e isso acelera a geração do arquivo. NV43. //$this->zip->setCompressionName($path . '/' . $file,ZipArchive::CM_STORE); } } } return true; } return false; } } if (isset($_FILES["conteudo_arquivo"])) { $_POST["fullPath"] = ltrim($_POST["fullPath"],"/"); $temp8844 = explode("/",dirname($_POST["fullPath"])); $temp1133 = $_POST["diretorio_arquivo"] ; for ($i=0;$i '
Erro HJ54.
 
Informações adicionais: ' . htmlentities(print_r(error_get_last(),true),ENT_QUOTES,"UTF-8") . '
;')); exit(); } } } $resultado = @move_uploaded_file($_FILES["conteudo_arquivo"]["tmp_name"],$_POST["diretorio_arquivo"] . $_POST["fullPath"]); if ($resultado !== false) { //A função "chmod" não funcionará quando o "Owner" do arquivo não for o usuário "apache" (mesmo realizando aquela configuração no "visudo" do manual de formatação do CentOS), ou seja, se algum arquivo tiver sido enviado através do FTP utilizando-se o usuário "root", então o comando abaixo retornará erro pois ele será executado pelo usuário "apache". Esse "bug" aparentemente só ocorre com o comando "chmod". YF34. @chmod($_POST["diretorio_arquivo"] . $_POST["fullPath"],0777); } if ($resultado === false) { echo json_encode(array('erro' => '
Erro ND54.
 
Informações adicionais: ' . htmlentities(print_r(error_get_last(),true),ENT_QUOTES,"UTF-8") . '
;')); exit(); } echo json_encode(array('sucesso' => 'O arquivo ' . $_POST["diretorio_arquivo"] . $_POST["fullPath"] . ' foi salvo com sucesso;')); exit(); } if (isset($_GET["acao"])) { if ($_GET["acao"] === "baixar_arquivo_zipado_e_remover") { header('Content-type: application/zip'); header('Content-Disposition: inline; filename="' . basename($_GET["arquivo_zipado"]) . '"'); header('Content-Transfer-Encoding: binary'); header('Accept-Ranges: bytes'); ob_clean(); flush(); if (readfile($_GET["arquivo_zipado"])) { if (strpos($_GET["arquivo_zipado"],$diretorio_root) !== 0) { exit("Erro NR51."); } unlink($_GET["arquivo_zipado"]); } } exit(); } if (isset($_POST["acao"])) { if ($_POST["acao"] === "renomear") { if (strpos($_POST["nome_atual_diretorio_arquivo"],$diretorio_root) !== 0) { echo json_encode(array('erro' => 'Erro PE34.')); exit(); } $resultado = @rename($_POST["nome_atual_diretorio_arquivo"],$_POST["novo_nome_diretorio_arquivo"]); if ($resultado !== false) { echo json_encode(array('sucesso' => 'O arquivo/diretório ' . $_POST["nome_atual_diretorio_arquivo"] . ' foi renomeado para ' . $_POST["novo_nome_diretorio_arquivo"] . ' com sucesso!')); } else{ echo json_encode(array('erro' => '
Erro ao renomear o arquivo/diretório ' . $_POST["nome_atual_diretorio_arquivo"] . ' para ' . $_POST["novo_nome_diretorio_arquivo"] . '.
 
Informações adicionais: ' . htmlentities(print_r(error_get_last(),true),ENT_QUOTES,"UTF-8") . '
')); } } else if ($_POST["acao"] === "salvar") { if (strpos($_POST["diretorio_arquivo"],$diretorio_root) !== 0) { echo json_encode(array('erro' => 'Erro NM51.')); exit(); } //$encoding_string = detectar_encoding_string(file_get_contents($_POST["diretorio_arquivo"])); $encoding_string = $_POST["encoding"]; if ($encoding_string === "Windows-1252") { $resultado = @file_put_contents($_POST["diretorio_arquivo"],mb_convert_encoding($_POST["conteudo"],"Windows-1252","UTF-8"),LOCK_EX); } else if ($encoding_string === "UTF-8") { $resultado = @file_put_contents($_POST["diretorio_arquivo"],$_POST["conteudo"],LOCK_EX); } else{ echo json_encode(array('erro' => 'Erro ao salvar o arquivo ' . $_POST["diretorio_arquivo"] . ' contendo ' . strlen($_POST["conteudo"]) . ' caracteres pois a codificação ' . $encoding_string . ' desse arquivo não possui condicional no script.')); return false; } if ($resultado !== false) { echo json_encode(array('sucesso' => 'O arquivo ' . $_POST["diretorio_arquivo"] . ', com encoding ' . $encoding_string . ' e contendo ' . strlen($_POST["conteudo"]) . ' caracteres foi salvo com sucesso!')); } else{ echo json_encode(array('erro' => '
Erro ao salvar o arquivo ' . $_POST["diretorio_arquivo"] . ', com encoding ' . $encoding_string . ' e contendo ' . strlen($_POST["conteudo"]) . ' caracteres.
 
Informações adicionais: ' . htmlentities(print_r(error_get_last(),true),ENT_QUOTES,"UTF-8") . '
')); } } else if ( ($_POST["acao"] === "copiar") or ($_POST["acao"] === "mover") ) { if (strpos($_POST["destino_copiar_mover_arquivos_diretorios"],$diretorio_root) !== 0) { echo json_encode(array('erro' => 'Erro WI45.')); exit(); } if (is_dir($_POST["destino_copiar_mover_arquivos_diretorios"]) === false) { echo json_encode(array('erro' => 'Erro ao ' . $_POST["acao"] . ' os arquivos/diretórios pois o diretório de destino ' . rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . '/ não existe.')); exit(); } $diretorios_arquivos = json_decode($_POST["diretorios_arquivos"],true); foreach ($diretorios_arquivos as $chave1 => $valor1) { if ( (strpos($diretorios_arquivos[$chave1],$diretorio_root) !== 0) or (strpos($diretorios_arquivos[$chave1],$_POST["diretorio_arquivo"]) !== 0) ) { echo json_encode(array('erro' => 'Erro PE45.')); exit(); } } foreach ($diretorios_arquivos as $chave1 => $valor1) { if ( (is_dir($diretorios_arquivos[$chave1])) and (strpos(rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/",rtrim($diretorios_arquivos[$chave1],"/") . "/") !== false) ) { echo json_encode(array('erro' => 'Erro ao ' . $_POST["acao"] . ' os arquivos/diretórios pois o diretório de destino ' . rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . '/ contém o diretório ' . rtrim($diretorios_arquivos[$chave1],"/") . '/ a ser copiado/movido.')); exit(); } } foreach ($diretorios_arquivos as $chave1 => $valor1) { if (substr_count($diretorios_arquivos[$chave1],"/") < 4) { echo json_encode(array('erro' => 'Erro ao ' . $_POST["acao"] . ' o arquivo/diretório ' . $diretorios_arquivos[$chave1] . ' pois o caminho não possui o número mínimo de "/".')); exit(); } } function copiar_diretorio_recursivamente($diretorio,$diretorio_acumulado) { global $qntd_arquivos_diretorios_copiados; if (is_dir(rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $diretorio_acumulado) === false) { $resultado = mkdir(rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $diretorio_acumulado); if ($resultado === false) { return false; } //Ver "YF34". @chmod(rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $diretorio_acumulado,0777); } if ($handle = opendir($diretorio)) { while (false !== ($entry = readdir($handle))) { if ( ($entry !== ".") and ($entry !== "..") ) { if (is_dir($diretorio . '/' . $entry)) { if (!copiar_diretorio_recursivamente($diretorio . '/' . $entry,$diretorio_acumulado . '/' . $entry . '/')) { return false; } } else{ $resultado = @copy($diretorio . '/' . $entry,rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $diretorio_acumulado . $entry); if ($resultado === false) { return false; } //Ver "YF34". @chmod(rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $diretorio_acumulado . $entry,0777); ++$qntd_arquivos_diretorios_copiados; } } } } return true; } $lista_acoes = array(); foreach ($diretorios_arquivos as $chave1 => $valor1) { $temp3345 = explode("/",rtrim($diretorios_arquivos[$chave1],"/")); $temp3345 = $temp3345[count($temp3345) - 1]; if ( (is_dir(rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $temp3345)) or (is_file(rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $temp3345)) ) { $lista_acoes[] = 'ERRO_ERRO_ERROErro ao ' . $_POST["acao"] . ' o arquivo/diretório ' . $diretorios_arquivos[$chave1] . ' pois ele já existe em ' . rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $temp3345 . ';'; } else{ if ($_POST["acao"] === "copiar") { if (is_file($diretorios_arquivos[$chave1])) { $resultado = @copy($diretorios_arquivos[$chave1],rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $temp3345); if ($resultado !== false) { //Ver "YF34". @chmod(rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $temp3345,0777); } if ($resultado !== false) { $lista_acoes[] = 'O arquivo ' . $temp3345 . ' foi copiado com sucesso;'; } else{ $lista_acoes[] = '
ERRO_ERRO_ERROErro ao executar o comando para copiar o arquivo ' . $diretorios_arquivos[$chave1] . '.
 
Informações adicionais: ' . htmlentities(print_r(error_get_last(),true),ENT_QUOTES,"UTF-8") . '
;'; } } else if (is_dir($diretorios_arquivos[$chave1])) { $qntd_arquivos_diretorios_copiados = 0; $resultado = copiar_diretorio_recursivamente($diretorios_arquivos[$chave1],$temp3345 . '/'); if ($resultado !== false) { $lista_acoes[] = 'O diretório ' . $temp3345 . ', que contém ' . $qntd_arquivos_diretorios_copiados . ' arquivos/diretórios, foi copiado com sucesso;'; } else{ $lista_acoes[] = 'ERRO_ERRO_ERROErro ao executar o comando para copiar o diretório ' . $diretorios_arquivos[$chave1] . ';'; } } } else if ($_POST["acao"] === "mover") { $resultado = @rename($diretorios_arquivos[$chave1],rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $temp3345); if ($resultado !== false) { //Não descomentar a linha abaixo pois quando se move determinado arquivo, principalmente se for algum arquivo de sistema, certamente se deseja manter as mesmas permissões já existentes. //Ver "YF34". //@chmod(rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . "/" . $temp3345,0777); } if ($resultado !== false) { $lista_acoes[] = 'O arquivo/diretório ' . $temp3345 . ' foi movido com sucesso;'; } else{ $lista_acoes[] = 'ERRO_ERRO_ERROErro ao executar o comando para mover o arquivo/diretório ' . $diretorios_arquivos[$chave1] . '.
 
Informações adicionais: ' . htmlentities(print_r(error_get_last(),true),ENT_QUOTES,"UTF-8") . '
;'; } } } } echo json_encode(array('sucesso' => 'Confira abaixo o resultado da cópia/movimentação do(s) arquivo(s)/diretório(s) ' . (($temp1177 = substr_count(implode('',$lista_acoes),'ERRO_ERRO_ERRO')) === 0?'':' com ' . $temp1177 . ' erro(s)') . ' para ' . rtrim($_POST["destino_copiar_mover_arquivos_diretorios"],"/") . '/:
  1. ' . implode('
  2. ',$lista_acoes) . '
')); } else if ($_POST["acao"] === "remover") { $diretorios_arquivos = json_decode($_POST["diretorios_arquivos"],true); foreach ($diretorios_arquivos as $chave1 => $valor1) { if ( (strpos($diretorios_arquivos[$chave1],$diretorio_root) !== 0) or (strpos($diretorios_arquivos[$chave1],$_POST["diretorio_arquivo"]) !== 0) ) { echo json_encode(array('erro' => 'Erro WQ78.')); exit(); } } foreach ($diretorios_arquivos as $chave1 => $valor1) { if (substr_count($diretorios_arquivos[$chave1],"/") < 4) { echo json_encode(array('erro' => 'Erro ao remover o arquivo/diretório ' . $diretorios_arquivos[$chave1] . ' pois o caminho não possui o número mínimo de "/".')); exit(); } } function remover_diretorio_recursivamente($diretorio) { global $qntd_arquivos_diretorios_removidos; if (!file_exists($diretorio)) { return true; } if (!is_dir($diretorio)) { ++$qntd_arquivos_diretorios_removidos; return @unlink($diretorio); } if ($handle = opendir($diretorio)) { while (false !== ($entry = readdir($handle))) { if ( ($entry !== ".") and ($entry !== "..") ) { if (!remover_diretorio_recursivamente($diretorio . '/' . $entry)) { return false; } } } ++$qntd_arquivos_diretorios_removidos; return @rmdir($diretorio); } } $lista_acoes = array(); foreach ($diretorios_arquivos as $chave1 => $valor1) { if (is_dir($diretorios_arquivos[$chave1])) { $qntd_arquivos_diretorios_removidos = 0; $resultado = remover_diretorio_recursivamente($diretorios_arquivos[$chave1]); if ($resultado) { $lista_acoes[] = 'O diretório ' . $diretorios_arquivos[$chave1] . ', que continha ' . $qntd_arquivos_diretorios_removidos . ' arquivos/diretórios, foi removido com sucesso;'; } else{ $lista_acoes[] = 'ERRO_ERRO_ERROErro ao executar o comando para remover o diretório ' . $diretorios_arquivos[$chave1] . ';'; } } else if (is_file($diretorios_arquivos[$chave1])) { $resultado = unlink($diretorios_arquivos[$chave1]); if ($resultado !== false) { $lista_acoes[] = 'O arquivo ' . $diretorios_arquivos[$chave1] . ' foi removido com sucesso;'; } else{ $lista_acoes[] = 'ERRO_ERRO_ERROErro ao executar o comando para remover o arquivo ' . $diretorios_arquivos[$chave1] . ';'; } } else{ $lista_acoes[] = 'ERRO_ERRO_ERROErro ao remover o arquivo/diretório ' . $diretorios_arquivos[$chave1] . ' pois ele não existe;'; } } // do diretório ' . $_POST["diretorio_arquivo"] . ' echo json_encode(array('sucesso' => 'Confira abaixo o resultado da remoção do(s) arquivo(s)/diretório(s) ' . (($temp1177 = substr_count(implode('',$lista_acoes),'ERRO_ERRO_ERRO')) === 0?'':' com ' . $temp1177 . ' erro(s)') . ':
  1. ' . implode('
  2. ',$lista_acoes) . '
')); } else if ($_POST["acao"] === "criar") { if (strpos($_POST["diretorio_arquivo"],$diretorio_root) !== 0) { echo json_encode(array('erro' => 'Erro WQ78.')); exit(); } if ($_POST["tipo_arquivo_diretorio"] === "diretório") { if (is_dir($_POST["diretorio_arquivo"])) { echo json_encode(array('erro' => 'Erro ao criar o diretório ' . $_POST["diretorio_arquivo"] . ' pois ele já existe.')); exit(); } $resultado = @mkdir($_POST["diretorio_arquivo"]); if ($resultado !== false) { //Ver "YF34". @chmod($_POST["diretorio_arquivo"],0777); } } else if ($_POST["tipo_arquivo_diretorio"] === "arquivo") { if (is_file($_POST["diretorio_arquivo"])) { echo json_encode(array('erro' => 'Erro ao criar o arquivo ' . $_POST["diretorio_arquivo"] . ' pois ele já existe.')); exit(); } $resultado = @file_put_contents($_POST["diretorio_arquivo"],"",LOCK_EX); if ($resultado !== false) { //Ver "YF34". @chmod($_POST["diretorio_arquivo"],0777); } } if ($resultado !== false) { echo json_encode(array('sucesso' => 'O ' . $_POST["tipo_arquivo_diretorio"] . ' ' . $_POST["diretorio_arquivo"] . ' foi criado com sucesso!')); } else{ echo json_encode(array('erro' => '
Erro ao executar o comando para criar o ' . $_POST["tipo_arquivo_diretorio"] . ' ' . $_POST["diretorio_arquivo"] . '.
 
Informações adicionais: ' . htmlentities(print_r(error_get_last(),true),ENT_QUOTES,"UTF-8") . '
')); } } else if ($_POST["acao"] === "zip") { $nome_arquivo_zipado = trim(substr(preg_replace("/[^0-9a-z_\-.]/i","_",str_replace("/","-",$_POST["diretorio_arquivo"])),-100),'-') . '-' . rand(10000,99999) . ".zip"; $arquivos_diretorios_a_serem_zipados = json_decode($_POST["arquivos_diretorios_a_serem_zipados"],true); $temp3624 = array(); foreach ($arquivos_diretorios_a_serem_zipados as $chave1 => $valor1) { $temp3624[] = str_replace(str_replace("\\","/",getcwd()) . "/","",$arquivos_diretorios_a_serem_zipados[$chave1]); } chdir($_POST["diretorio_arquivo"]); foreach ($temp3624 as $chave3624 => $valor3624) { $temp3624[$chave3624] = str_replace($_POST["diretorio_arquivo"],"",$temp3624[$chave3624]); } $zipper = new FM_Zipper(); $resultado = $zipper->zip($_POST["diretorio_arquivo"] . $nome_arquivo_zipado,$temp3624); if ($resultado !== false) { echo json_encode(array('sucesso' => 'No arquivo ' . $_POST["diretorio_arquivo"] . $nome_arquivo_zipado . ' foram zipados os arquivos/diretórios a seguir:
  1. ' . implode('
  2. ',$arquivos_diretorios_a_serem_zipados) . '
','arquivo_zipado' => $_POST["diretorio_arquivo"] . $nome_arquivo_zipado)); } else{ echo json_encode(array('erro' => 'Erro ao executar o comando para zipar os arquivos/diretórios abaixo no diretório ' . $_POST["diretorio_arquivo"] . '.
  1. ' . implode('
  2. ',$arquivos_diretorios_a_serem_zipados) . '
')); } } else if ($_POST["acao"] === "unzip") { $zipper = new FM_Zipper(); $resultado = $zipper->unzip($_POST["arquivo_a_ser_unzipado"],$_POST["diretorio_arquivo"]); if ($resultado !== false) { echo json_encode(array('sucesso' => 'O conteúdo do arquivo ' . $_POST["arquivo_a_ser_unzipado"] . ' foi extraído com sucesso.')); } else{ echo json_encode(array('erro' => 'Erro ao executar o comando para unzipar o arquivo ' . $_POST["arquivo_a_ser_unzipado"] . ' no diretório ' . $_POST["diretorio_arquivo"] . '.')); } } exit(); } function detectar_encoding_string($string) { //Não utilize algo como -->>if (preg_match("/[" . utf8_decode("áãàéèíóõúçÁÃÀÉÈÍÓÕÚÇ") . "]/",$string)) {<<-- pois executar expressões regulares num script rodando em PHP com base numa string em outro encoding acaba gerando erros na detecção. Também não utilize "stripos" pois não funciona corretamente, utilize "strpos". $temp = array('á','ã','à','é','è','í','ó','õ','ú','ç','Á','Ã','À','É','È','Í','Ó','Õ','Ú','Ç'); $encontrou_caracter = false; foreach ($temp as $chave1 => $valor1) { if (strpos($string,$temp[$chave1]) !== false) { $encontrou_caracter = true; break; } } if ($encontrou_caracter) { return "UTF-8"; } else{ return "Windows-1252"; } } function carregar_arquivo_para_edicao($conteudo_arquivo) { $encoding_string = detectar_encoding_string($conteudo_arquivo); if ($encoding_string === "Windows-1252") { return str_replace(array("\r","\n",''),array('','\n','<\/script>'),addslashes(mb_convert_encoding($conteudo_arquivo,"UTF-8","Windows-1252"))); } else if ($encoding_string === "UTF-8") { return str_replace(array("\r","\n",''),array('','\n','<\/script>'),addslashes($conteudo_arquivo)); } else{ exit("Erro KF53."); } } if ($arquivo !== false) { $conteudo_arquivo = file_get_contents($arquivo); } ?> Administrar arquivos
 
'arquivo', 'nome' => $entry, 'diretorio_arquivo' => $diretorio . $entry, 'tamanho' => filesize($diretorio . $entry), 'permissoes' => fileperms($diretorio . $entry), 'hora_data_ultima_modificacao' => filemtime($diretorio . $entry), 'hora_data_ultimo_acesso' => fileatime($diretorio . $entry) ); } else if (is_dir($diretorio . $entry)) { $saida['ordenar1'][] = 'diretorio'; $saida['ordenar2'][] = mb_strtolower($entry,"UTF-8"); $saida['string'][] = array( 'tipo' => 'diretório', 'nome' => $entry, 'diretorio_arquivo' => $diretorio . $entry, 'tamanho' => 0, 'permissoes' => fileperms($diretorio . $entry), 'hora_data_ultima_modificacao' => filemtime($diretorio . $entry), 'hora_data_ultimo_acesso' => fileatime($diretorio . $entry) ); } } } if (empty($saida)) { echo '
Este diretório não possui arquivos/subdiretórios
'; } else{ array_multisort($saida['ordenar1'],SORT_STRING,SORT_DESC,$saida['ordenar2'],SORT_STRING,SORT_ASC,$saida['string']); echo ' '; foreach ($saida['string'] as $chave1 => $valor1) { echo ' '; } echo '
#
Nome Ações Tamanho Data da última modificação Data do último acesso Permissões
' . ($chave1 + 1) . '
  ' . ($saida['string'][$chave1]['tipo'] === 'arquivo'?number_format($saida['string'][$chave1]['tamanho']/1024/1024,2,",",".") . ' MB':'') . ' ' . date("H:i:s d/m/Y",$saida['string'][$chave1]['hora_data_ultima_modificacao']) . ' ' . date("H:i:s d/m/Y",$saida['string'][$chave1]['hora_data_ultimo_acesso']) . ' ' . substr(sprintf('%o',$saida['string'][$chave1]['permissoes']),-4) . '
'; } ?>