/** * Método que realiza o upload de arquivos para a pasta informada. * * @param array $arquivo Um array contendo os dados recebidos via post contendo os arquivos * @param string $pastaDestino O nome da pasta dentro da pasta de uploads do sistema * @param array $tiposAceitos Um array contendo os tipos aceitos onde as chaves são as extenções. * Caso não seja informado, aceita qualquer tipo arquivo. O array deve possuir os mimetypes e não as extenções * @param string $nomeSugerido Caso seja informado, usa como node do arquivo * @param bool $privado Define se o arquivo será salvo na pasta privada ou não * * @return bool|string Retorna o nome do arquivo caso seja enviado com sucesso ou false em caso de erro * * @throws Exception */ public function upload($arquivo, $pastaDestino, array $tiposAceitos = array(), $nomeSugerido = false, $privado = false) { //Verificando a variável do arquivo if (!is_array($arquivo)) { throw new Exception('O arquivo não é válido', 1); } //Verificando se o arquivo tem um nome válido if (!strlen($arquivo['name'])) { throw new Exception('O arquivo informado é inválido', 2); } //Testando o tipo do arquivo if (count($tiposAceitos)) { if (!Arrays::in_array_r($arquivo['type'], $tiposAceitos)) { throw new Exception('O formato do arquivo não é permitido', 3); } //Testando a extenção do arquivo $ext = substr($arquivo['name'], strrpos($arquivo['name'], '.') + 1); if (!strlen($ext)) { throw new Exception('O arquivo é inválido', 4); } if (!isset($tiposAceitos[$ext])) { throw new Exception("A extenção do arquivo não é permitida", 9); } if (is_array($tiposAceitos[$ext])) { if (!in_array($arquivo['type'], $tiposAceitos[$ext])) { throw new Exception('O arquivo é inválido', 5); } } else { if ($tiposAceitos[$ext] != $arquivo['type']) { throw new Exception('O arquivo é inválido', 10); } } } //Testendo o tamanho do arquivo enviado $maxSizeUpload = ini_get('upload_max_filesize'); if ((int) $arquivo['size'] > Matematica::returnBytes($maxSizeUpload)) { throw new Exception('O tamanho do arquivo é maior do que o permitido', 6); } //Criando a pasta if ((bool) $privado) { //Definindo o destino para a pasta privada, sem acesso via URL $pasta = $this->pastaUploadPrivado . DIRECTORY_SEPARATOR . $pastaDestino; } else { $pasta = $this->pastaUpload . DIRECTORY_SEPARATOR . $pastaDestino; } if (!file_exists($pasta)) { if (!mkdir($pasta, 0755, true)) { throw new Exception('Não é possível enviar o arquivo. Entre em contato com o administrador', 7); } } if (substr($pasta, -1) == '/') { $pasta = substr($pasta, -1); } //Definindo o nome do arquivo $ext = substr($arquivo['name'], strrpos($arquivo['name'], '.')); if (is_string($nomeSugerido)) { $nome = substr($nomeSugerido, 0, strrpos($nomeSugerido, ".")); $nome .= $ext; } else { $nome = md5(microtime() . $arquivo['name']) . "{$ext}"; } //Enviando o arquivo if (!move_uploaded_file($arquivo['tmp_name'], "{$pasta}/{$nome}")) { throw new Exception("Falha ao tentar enviar o arquivo {$pasta}", 8); } return $nome; }
/** * Método que realiza o upload de arquivos para a pasta informada * @param array $arquivo Um array contendo os dados recebidos via post contendo os arquivos * @param string $pastaDestino O nome da pasta dentro da pasta de uploads do sistema * @param array $tiposAceitos Um array contendo os tipos aceitos onde as chaves são as extenções. * Caso não seja informado, aceita qualquer tipo arquivo. O array deve possuir os mimetypes e não as extenções * @param string $nomeSugerido Caso seja informado * @return boolean|string Retorna o nome do arquivo caso seja enviado com sucesso ou false em caso de erro * @throws Exception */ public function upload($arquivo, $pastaDestino, array $tiposAceitos = array(), $nomeSugerido = false) { //Verificando a variável do arquivo if (!is_array($arquivo)) { throw new Exception("O arquivo não é válido", 1); } //Verificando se o arquivo tem um nome válido if (!strlen($arquivo['name'])) { throw new Exception("O arquivo informado é inválido", 2); } //Testando o tipo do arquivo if (count($tiposAceitos)) { if (!Arrays::in_array_r($arquivo["type"], $tiposAceitos)) { throw new Exception("O formato do arquivo não é permitido", 3); } //Testando a extenção do arquivo $ext = substr($arquivo['name'], strrpos($arquivo['name'], ".") + 1); if (!strlen($ext)) { throw new Exception("O arquivo é inválido", 4); } if (!isset($tiposAceitos[$ext])) { throw new Exception("A extenção do arquivo não é permitida: {$ext} - " . $arquivo['name'], 9); } if (is_array($tiposAceitos[$ext])) { if (!in_array($arquivo["type"], $tiposAceitos[$ext])) { throw new Exception("O arquivo é inválido", 5); } } else { if ($tiposAceitos[$ext] != $arquivo["type"]) { throw new Exception("O arquivo é inválido", 10); } } } //Testendo o tamanho do arquivo enviado $maxSizeUpload = ini_get("upload_max_filesize"); if ((int) $arquivo['size'] > Matematica::returnBytes($maxSizeUpload)) { throw new Exception("O tamanho do arquivo é maior do que o permitido", 6); } //Criando a pasta $pasta = "{$this->pastaUpload}/{$pastaDestino}"; if (!file_exists($pasta)) { if (!mkdir($pasta, 0755, true)) { throw new Exception("Não é possível enviar o arquivo. Entre em contato com o administrador", 7); } } if (substr($pasta, -1) == "/") { $pasta = substr($pasta, -1); } //Definindo o nome do arquivo $ext = substr($arquivo['name'], strrpos(".", $arquivo['name'])); $nome = is_string($nomeSugerido) ? $nomeSugerido : md5(microtime() . $arquivo['name']) . ".{$ext}"; //Enviando o arquivo if (!move_uploaded_file($arquivo["tmp_name"], "{$pasta}/{$nome}")) { throw new Exception("Falha ao tentar enviar o arquivo {$pasta}", 8); } return $nome; }