✏️ 正在编辑: RepositorioChamadasFtp.php
路径:
/srv/systems_dir/yuppiecred/library/Core/Callcenter/Service/RepositorioChamadasFtp.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php /** * Fornece uma interface para comunicação com o repositório * de gravação de chamadas do callcenter */ class Core_Callcenter_Service_RepositorioChamadasFtp { private static $instance; private static $connection; private $s3; private $integracao; private $_ip; private $_porta; private $_usuario; private $_senha; private $_diretorio; /** * Evita que a classe seja instanciada publicamente. * @return void */ private function __construct($integracao) { $callcenterConfig = CLIENT_PATH . '/configs/callcenter.php'; if( !file_exists($callcenterConfig) ){ throw new Core_Exception("Configurações do callcenter não encontradas"); } $dados = include $callcenterConfig; $this->setConfig($dados); $this->integracao = $integracao; $config = new Zend_Config_Ini(APPLICATION_PATH . "/configs/application.ini"); $amazon = $config->production->amazon->s3; if(!empty($amazon)){ $this->s3 = new Yuppie_Amazon_S3($amazon->toArray()); } } /** * Evita que a classe seja clonada. * @return void */ private function __clone() { } /** * Método unserialize do tipo privado para prevenir a * desserialização da instância dessa classe. * @return void */ private function __wakeup() { } private function setConfig($dados) { $classVars = get_class_vars(get_class($this)); $vars = preg_grep("/_[a-z].*/", array_keys($classVars)); foreach ( $vars as $var ) { $field = ltrim($var, "_"); if( empty($dados[$field]) ){ throw new Core_Exception(ucfirst($field) . ' não configurado no callcenter'); } $this->$var = $dados[$field]; } } private function getConection() { if( !isset(self::$connection) ){ self::$connection = ftp_connect($this->_ip, $this->_porta, 120); if(self::$connection == FALSE){ throw new Core_Exception("Falha na conexão com o repositório. " . "Por favor vefirique o IP e Porta cadastrados na " . "configuração do callcenter"); } if(!ftp_login(self::$connection, $this->_usuario, $this->_senha)){ throw new Core_Exception("Falha na autenticação com o repositório. " . "Por favor vefirique o Usuário e Senha cadastrados na " . "configuração do callcenter"); } ftp_pasv(self::$connection, true); } ftp_chdir(self::$connection, $this->_diretorio); return self::$connection; } /** * Formata os dados de acordo com a integração do cliente * @param array $arquivos Lista de arquivos retornados pelo ftp * @return array Dados normalizados para exibição conforme a classe selecionada */ public function formatarDados(array $arquivos) { return $this->integracao->formatarDados($arquivos); } /** * Testa se há instância definida na propriedade, * caso sim, a classe não será instanciada novamente. * DesignPattern\Singleton * @return Core_Callcenter_Service_RepositorioChamadasFtp */ public static function getInstance() { if( !isset(self::$instance) ){ self::$instance = new self(new Core_Callcenter_Service_IntegracaoFtp()); } return self::$instance; } /** * Finaliza a transação no serviço ftp * @return void */ public function close() { ftp_close($this->getConection()); self::$connection = null; } /** * Lista os arquivos disponíveis de acordo com a data informada * @param array $dados Dados da requisicao * @param array $userFolder Pasta para download temporário * dos arquivos buscados pelo usuário * @return array Lista de arquivos encontrados */ public function listarArquivos(array $dados, $userFolder) { $conn = $this->getConection(); $fileLocation = $this->integracao->getDir($dados); if(@!ftp_chdir($conn, $fileLocation)){ return array(); } $localDir = PUBLIC_PATH . "/downloads/tmp/" . $userFolder; $this->limparArquivosTemp($userFolder); $arquivos = $this->integracao->aplicarFiltros(ftp_rawlist($conn, '.'), $dados); $registros = $this->formatarDados($arquivos); $remoteDir = "{$this->_diretorio}/$fileLocation"; foreach ($registros as &$registro){ $this->baixarGravacao($registro['arquivo'], $remoteDir, $localDir); } return $registros; } /** * Baixa o arquivo para o diretório informado * @param string $file Arquivo a ser baixado * @param string $remoteDir Caminho do arquivo * @param string $localDir Diretório para salvar o arquivo * @return boolean TRUE caso o arquivo tenha sido encontrato e baixado * FALSO, caso contrário * @throws checked Exception */ public function baixarGravacao(&$file, $remoteDir, $localDir) { if( !file_exists($localDir) ){ if(!mkdir($localDir, 0777, true)){ throw new Exception('Não foi possível salvar o arquivo no diretório: ' . $localDir); } } $remoteFile = "$remoteDir/$file"; $localFile = "$localDir/$file"; $dados = explode(".",substr($file, -4)); $extensao = array_pop($dados); $newFile = str_replace($extensao, "mp3", $localFile); if(!file_exists($newFile)){ $conn = $this->getConection(); $result = ftp_get($conn, $localFile, $remoteFile, FTP_BINARY); if($result && $extensao != "mp3"){ shell_exec("ffmpeg -i $localFile -vn -ac 1 -ab 32k -f mp3 $newFile"); unlink($localFile); } } return $file = str_replace($extensao, "mp3", $file); } /** * Persiste as gravacoes na pasta gravacoes * @param string $file Nome do arquivo a ser persistidos * @param array $userFolder Pasta para download temporário * @return boolean TRUE caso o arquivo tenha sido encontrato e baixado * FALSO, caso contrário * @throws checked Exception */ public function persistir($file, $userFolder) { $tempDir = PUBLIC_PATH . "/downloads/tmp/$userFolder"; $tempPath = "$tempDir/$file"; if( !file_exists($tempPath) ){ throw new Exception('Arquivo não encontrato no diretório: ' . $tempDir); } if(empty($this->s3)){ throw new Core_Exception('Configurações de persistência não encontradas'); } return $this->s3->putObject(Yuppie_Auth::getSiteKey() . "/callcenter/gravacoes/$file", $tempPath); } /** * Consulta a url do arquivo no repositório da amazon * @param array $file Nome do arquivo a ser consultado * @return string Url do arquivo * @throws uncheked Core_Exception */ public function getUrlPersistida($file) { if(empty($this->s3)){ throw new Core_Exception('Configurações de persistência não encontradas'); } return $this->s3->getSignedUrl(Yuppie_Auth::getSiteKey() . "/callcenter/gravacoes/$file", "+5 minutes"); } /** * Exclui os arquivos na pasta temporária * @param array $userFolder Pasta para download temporário * @return boolean TRUE em caso de sucesso na exclusão */ public function limparArquivosTemp($userFolder) { $tempDir = PUBLIC_PATH . "/downloads/tmp/$userFolder"; if( file_exists($tempDir) ){ $result = count(array_map('unlink', glob("$tempDir/*"))); return rmdir($tempDir) && $result > 0; } return true; } }
💾 保存文件
← 返回文件管理器