Leobreda.Net
HTML | DHTML | JavaScript | DOM | Ajax | Asp | Asp.net | PHP | Ms. SQL | MySQL
Pesquisa por: classe
04 de agosto de 2009 07:51125 visitas
Programação Orientada à Objeto (POO) é uma coisa que está me ajudando atualmente, pois evita criar códigos redundantes.
Pra quem sabe trabalhar com POO em PHP, abaixo uma classe que utilizo constantemente para manipular imagens: criar thumbnail e listar todas as imagens de determinado diretório.
Classe ArquivoImagem:
<?php
Class ArquivoImagem
{
var $diretorio;
var $diretorioDestino;
var $arquivo;
var $largura;
var $altura;
#########################################################
# Monta uma relação de imagens em determinado diretório
# Saída: Vetor com informações do tipo nome, tamanho do arquivo, largura e altura
#########################################################
function ListarImagens()
{
$diretorio = strtolower($this->diretorio);
$vetor_arquivos = array();
//1. Abre o diretório
if(is_dir($diretorio))
{
$pasta = opendir($diretorio);
$i=0;
while (false !==($file = readdir($pasta)))
{
if (($file != '.') && ($file != '..'))
{
//Apenas imagens com extensão jpeg, jpg, gif, png
if ((!is_dir($file)) && (eregi('(jpeg|jpg|gif|png)$', $file)) && (false===strpos($file, "thumbnail_")))
{
# [0] = Nome do arquivo
# [1] = Tamanho do arquivo, em bytes
# [2] = Largura
# [3] = Altura
$vetor_arquivos[$i][0] = $file;
$vetor_arquivos[$i][1] = filesize($diretorio.$vetor_arquivos[$i][0]);
$vetor_arquivos[$i][2] = GetImageSize($diretorio.$vetor_arquivos[$i][0]);$vetor_arquivos[$i][2] = $vetor_arquivos[$i][2][0];
$vetor_arquivos[$i][3] = GetImageSize($diretorio.$vetor_arquivos[$i][0]);$vetor_arquivos[$i][3] = $vetor_arquivos[$i][3][1];
$i++;
}
}
}
closedir($pasta);
}
return $vetor_arquivos;
unset($vetor_arquivos);
}
#########################################################
# Cria Thumbnail de determinada Imagem
#########################################################
function CriarThumbnail()
{
$diretorio = strtolower($this->diretorio); //Diretório onde se encontra a imagem
$diretorioDestino = strtolower($this->diretorioDestino); //Diretório onde será salvo o thumbnail
$arquivo = strtolower($this->arquivo); //Nome do arquivo da imagem
$altura = strtolower($this->altura); //Tamanho da imagem, em altura
$largura = strtolower($this->largura); //Tamanho da imagem, em largura
//1. Lê a imagem de origem
$img_origem = imagecreatefromjpeg($diretorio.$arquivo);
//2. Pega as dimensões da imagem de origem
$origem_x = imagesx($img_origem); // Largura
$origem_y = imagesy($img_origem); // Altura
//3. Escolhe a largura maior, e se baseando nela mesma, gera a largura menor
if($origem_x > $origem_y) // Se a largura for maior que a altura
{
$final_x = $largura; // A largura será a do thumbnail
$final_y = floor($largura * $origem_y / $origem_x); // A altura é calculada
$f_x = 0; // Colar no x = 0
$f_y = round(($altura / 2) - ($final_y / 2)); // Centralizar a imagem no meio y do thumbnail
}
else
{ // Se a altura for maior ou igual à largura
$final_x = floor($altura * $origem_x / $origem_y); // Calcula a largura
$final_y = $altura; // A altura será a do thumbnail
$f_x = round(($largura / 2) - ($final_x / 2)); // Centraliza a imagem no meio x do thumbnail
$f_y = 0; // Colar no y = 0
}
//4. cria a imagem final para o thumbnail
$img_final = imageCreatetruecolor($largura,$altura);
//5. Define a cor do fundo (branco)
imagefill($img_final,0,0,imagecolorallocate($img_final, 255, 255, 255));
//6. Copia a imagem original para dentro do thumbnail
imagecopyresampled($img_final, $img_origem, $f_x, $f_y, 0, 0, $final_x, $final_y, $origem_x, $origem_y);
//7. Salva o thumbnail
imagejpeg($img_final, $diretorioDestino."thumbnail_".$arquivo, 90);
//8. Garbage Collector
ImageDestroy($img_origem);
ImageDestroy($img_final);
}
}
04 de agosto de 2009 06:50201 visitas
Dias atrás tive um certo problema com o ASP: efetuar upload nele é a pior coisa que existe, ainda mais em arquivos com mais de 2MB.
Hoje em dia, não basta upload de imagens e documentos do Word e PDF, pois sabemos que a maioria dos sites já estão trabalhando com conteúdos multimídia, tais como áudio e vídeo.
Existe uma solução paga que resolve o problema, as empresas de hospedagem possuem tal componente instalado, porém você não vai pagar para ter uma DLL instalada em sua estação de desenvolvimento por uma simples função de upload.
A minha solução foi esta aqui: separar as páginas que efetuam o UPLOAD em linguagem PHP.
Para efetuar o upload:
<form method="post" action="upload.php" enctype="multipart/form-data">
<input type="file" name="arquivo" />
<input type="submit" value="upload" />
</form>
Arquivo upload.php
<?php
include_once("cla_arquivo.php");
$objArquivo = new Arquivo;
$objArquivo->diretorio = c:\site\arquivos\";
$objArquivo->arquivo = $_FILES["arquivo"];
$objArquivo->tamanho = 4096000; //tamanho máximo: 4mb
$objArquivo->arquivo = $arquivo;
$objArquivo->EfetuaUpload();
$titulo = $objArquivo->titulo; //retorna o nome do arquivo tratado dentro do método
$erro = $objArquivo->erro; //retorna mensagem de erro (se houver)
$tamanho = $objArquivo->tamanho; //retorna o tamanho do arquivo (em bytes)
unset($objArquivo); //destrói o objeto
Classe Arquivo - cla_arquivo.php
Class Arquivo
{
var $diretorio;
var $titulo;
var $tamanho;
var $arquivo;
var $erro;
###########################################################################################################
# Efetua o upload do arquivo
#
# Entra: diretorio : Diretório de destino
# tamanho : Tamanho máximo do arquivo (em bytes)
# arquivo : Arquivo binário + caminho do arquivo (lado cliente)
#
# Retorna: arquivo : O nome do arquivo tratado
# tamanho : Tamanho do arquivo (em bytes)
# erro : Mensagem de erro
###########################################################################################################
function EfetuaUpload()
{
$diretorio = strtolower(trim($this->diretorio)); //Diretório de destino
$tamanho = $this->tamanho; //Tamanho máximo do arquivo (em bytes)
$arquivo = $this->arquivo; //Arquivo binário
$this->erro = ''; //Nenhum erro até agora
$this->$titulo = $arquivo['name']; //Nome do arquivo
//Verifica se ultrapassou o tamanho máximo de arquivo Tolerância: 10%
if(intval($arquivo['size'])>intval($tamanho*1.1))
{
$this->erro = 'O tamanho do arquivo ultrapassou ' . $tamanho . ' Bytes';
unset($diretorio, $tamanho, $titulo, $arquivo);
return;
}
//Trata o nome do arquivo, com limite de 30 caracteres
$objArquivo = new Arquivo;
$titulo = $objArquivo->TratarNomeArquivo(strtolower($titulo), 30);
//Cria diretório de destino (se necessário)
$objArquivo->CriarDiretorio($diretorio);
unset($objArquivo);
//Insere a barra "\" no final do diretório, se não houver a mesma
if(substr($diretorio, strlen($diretorio)-1, 1)!="\")
{
$diretorio+="";
}
//Efetua o Upload. ATENÇÃO: Verifique se o diretório temporário aceita mover arquivos. Consulte php.ini...
if(!move_uploaded_file($arquivo['tmp_name'], $diretorio.$titulo))
{
$this->erro = 'Não foi possível efetuar o upload. Favor contate o Administrador. Código de erro:'.$arquivo['error'].' Descrição do erro:'.print_r($arquivo).': '.mysql_error();
echo($arquivo);
unset($diretorio, $titulo, $tamanho, $arquivo);
return;
}
//Devolve o novo nome do arquivo, tamanho, e mensagem de erro em branco
$this->titulo = $titulo;
$this->tamanho = intval($arquivo['size']);
$this->erro = '';
unset($diretorio, $titulo, $tamanho, $arquivo);
}
###########################################################################################################
# Trata o nome do arquivo, retirando determinados caracteres
# Saída: Nome do arquivo sem pontuação, espaço e acentuação.
###########################################################################################################
function TratarNomeArquivo($arquivo, $tamanho=0)
{
//1. Separa a extensão do arquivo
$extensao = substr($arquivo, strrpos($arquivo, "."));
//2. Separa apenas o nome do arquivo, sem extensão
$arquivo = str_replace($extensao, "", $arquivo);
//3. Retira acentuação
$arquivo = str_replace("á", "a", $arquivo); $arquivo = str_replace("à", "a", $arquivo); $arquivo = str_replace("ã", "a", $arquivo); $arquivo = str_replace("â", "a", $arquivo);
$arquivo = str_replace("é", "e", $arquivo); $arquivo = str_replace("è", "e", $arquivo); $arquivo = str_replace("ê", "e", $arquivo);
$arquivo = str_replace("í", "i", $arquivo); $arquivo = str_replace("ì", "i", $arquivo);
$arquivo = str_replace("ó", "o", $arquivo); $arquivo = str_replace("ô", "o", $arquivo); $arquivo = str_replace("ô", "o", $arquivo);
$arquivo = str_replace("ú", "u", $arquivo); $arquivo = str_replace("ù", "u", $arquivo); $arquivo = str_replace("ü", "u", $arquivo);
$arquivo = str_replace("!", "", $arquivo); $arquivo = str_replace("@", "", $arquivo); $arquivo = str_replace("+", "-", $arquivo);
$arquivo = str_replace(" ", "_", $arquivo); $arquivo = str_replace("___", "_", $arquivo); $arquivo = str_replace("__", "_", $arquivo);
//4. Limita a quantidade de caracteres
if($tamanho!=0)
{$arquivo = substr($arquivo,0, $tamanho-1);}
return $arquivo.$extensao;
}
###########################################################################################################
# Cria diretório
###########################################################################################################
function CriarDiretorio($diretorio)
{
$diretorio = str_replace("/", "", $diretorio);
$diretorioX = explode("", $diretorio);
$diretorioY = $diretorioX[0];
for($i=1;$i<count($diretorioX);$i++)
{
$diretorioY.="". $diretorioX[$i];
if($i>2) //Evita considerar que "C:" seja diretório, como também diretórios virtuais
{
if(!is_dir($diretorioY)){mkdir($diretorioY, 0777);}
}
}
}
}
Você pode incrementar a classe Arquivo com métodos para excluir arquivos e diretórios:
###########################################################################################################
# Exclui arquivo
###########################################################################################################
function ExcluirArquivo()
{
$diretorio = strtolower($this->diretorio); //Diretório onde consta o arquivo
$arquivo = $this->arquivo; //Arquivo a ser deletado
if(file_exists($diretorio.$arquivo))
{
unlink($diretorio.$arquivo);
}
}
###########################################################################################################
# Exclui diretório
###########################################################################################################
function ExcluirDiretorio()
{
$diretorio = strtolower($this->diretorio);
if(is_dir($diretorio)) // verifica se realmente é uma pasta
{
if($handle = opendir($diretorio)) //Abre o diretório
{
while(false !== ($file = readdir($handle))) // Varre cada um dos arquivos da pasta
{
if(($file == ".") or ($file == ".."))
{
continue;
}
if(is_dir($file)) // verifica se o arquivo atual é uma pasta
{
// caso seja uma pasta, faz a chamada para a funcao novamente
$objExcluir = new Arquivo;
$objEcluir->diretorio = $diretorio . $file;
$objExcluir->ExcluirDiretorio();
unset($objExcluir);
} else
{
// caso seja um arquivo, exclui ele
unlink($diretorio.$file);
}
}
// fecha a pasta aberta
closedir($handle);
rmdir($diretorio); //exclui o diretório
}
}
}
13 de dezembro de 2008 14:48536 visitas
Trabalhar com classes hoje em dia, fica fácil quando se desenvolve em mais de um ambiente, onde a entrada e saída de resultados é a mesma.
Imagine as seguintes situações em um site de comércio eletrônico:
Ficaria difícil criar uma página para cadastro, e duplicá-las vendo que há muitos trechos do código-fonte totalmente iguais.
Resumindo: classe é uma maneira de reutilizar blocos de códigos repetitivos, com entrada e saída de dados.
A seguir, utilizei o conceito de classe para aprendizagem. Ficaria difícil aprender seguindo os tutoriais do Macoratti sem ter pelo menos uma aprendizagem básica.
Esta é uma tela na qual digito o nome e a idade.

Ao clicar no botão Calcular, a página é recarregada, me devolvendo a soma da idade, e concatena o nome na pessoa

Arquivo Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
http://www.w3.org/1999/xhtml">
<table style="border: 1px solid #eaeaea; margin: auto;" border="0" cellpadding="0" cellspacing="5">
<tr>
<td>Pessoa</td>
<td><input name="NOME" id="NOME" size="30" runat="server" type="text"></td>
</tr>
<tr>
<td>idade</td>
<td><input name="IDADE" id="IDADE" size="5" maxlength="5" runat="server" type="text">+ 7</td>
</tr>
<tr>
<td colspan="2" style="text-align: center;">
<asp:button id="calcularButton" runat="server" text="Calcular" onclick="calcularButton_Click"></asp:button>
</td>
</tr>
<tr>
<td>Pessoa</td>
<td id="NOME_FINAL" runat="server">???</td>
</tr>
<tr>
<td>Idade</td>
<td id="IDADE_FINAL" runat="server">???</td>
</tr>
</table>
Arquivo Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using pessoa;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void calcularButton_Click(object sender, EventArgs e)
{
Pessoa calcular = new Pessoa();
calcular.Nome = NOME.Value.ToString();
calcular.Idade = Convert.ToInt32(IDADE.Value.ToString());
calcular.SomaIdade();
calcular.ConcatenaNome();
IDADE_FINAL.InnerHtml = Convert.ToString(calcular.Idade);
NOME_FINAL.InnerHtml = Convert.ToString(calcular.Nome);
}
}
Arquivo pessoa.cs
using System;
using System.Data;
using System.Configuration;
namespace pessoa
{
public class Pessoa
{
#region Variáveis locais
string _nome;
int _idade;
int _idadeFinal;
#endregion
public string Nome { get { return _nome; } set { _nome = value; } }
public Int32 Idade { get { return _idade; } set { _idade = value; } }
public void SomaIdade()
{
Idade = _idade + 7;
}
public void ConcatenaNome()
{
Nome += " Fulano";
}
}
}
Funcionamento:
1. Ao clicar no botão Calcular, a função calcularButton_Click é acionada.

2. Na função calcularButton_Click:
AMARELO: Criado o objeto calcular, onde é instanciado a classe Pessoa() (veremos mais a frente).
VERMELHO: A propriedade Nome recebe o valor NOME. A propriedade Idade recebe o valor IDADE.
AZUL: chamamos o método SomaIdade() e ConcatenaNome(), que estão dentro da classe Pessoa().
VERDE: mandamos para os objetos da página IDADE_FINAL e NOME_FINAL os valores processados internamente em calcular.Idade e calcular.Nome

NOTA: Caso você não declarar o namespace pessoa (using pessoa;), poderá ocorrer um erro de que a Classe Pessoa() não existe:
Erro de Servidor no Aplicativo '/'.
|
Linha 18: protected void calcularButton_Click(object sender, EventArgs e) |
Para contornar este erro, declare o namespace pessoa no arquivo Default.aspx.cs:

3. Classe pessoa:
VERDE: declaração de variáveis locais.
AMARELO: atribui o valor das variáveis locais através dos Atributos (calcular.Nome e calcular.Idade) da classe Pessoa().
VERMELHO: Métodos da classe: SomaIdade() altera o valor da propriedade calcular.Nome, e ConcatenaNome altera o valor da propriedade calcular.Pessoa.

Para visualizar no modo gráfico como ficou sua classe, clique com o botão direito no arquivo pessoa.cs, e clique na opção View Class Diagram:
![]() |
![]() |
Para ser mais claro, os métodos de uma classe, internamente, se resumem a funções/procedimentos na qual realizam determinadas tarefas de uma forma automatizada. Digo forma automatizada porque com o tempo, estaremos utilizando-as constantemente, que para nós, não interessa o funcionamento interno; basta fazer no que lhe for determinado e nos traga o resultado final.