Leobreda.Net

HTML | DHTML | JavaScript | DOM | Ajax | Asp | Asp.net | PHP | Ms. SQL | MySQL

TAG cloud

.net     ajax     api     arquivo     array     asp     asp.net     banco de dados     bing     bloqueio     boas práticas     bug     c sharp     c#     c#     chart     classe     collate     collation     complemento     complementos     componente     conexão sql     connection string     css     cursor location     desativar programas     dom     erro cs0246     explorer     ferramenta de busca     firefox     ftp     função     global.asa     global.asax     google     gráfico     helicon     hospedagem ruim     hostphd     http 301     imagem     include     indexação     inicialização     insert     internet lenta     legendas     limit

Pesquisa por: classe

Manipulando imagens em PHP

array, classe, imagem, php, thumbnail

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);
  }
 }

Manipulando arquivos em PHP

arquivo, classe, mkdir, php, rmdir, unlink, upload

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
    }
     
   }
  } 

Trabalhando com classes em C#

.net, c#, classe, erro cs0246, namespace, reutilização

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:

  • O usuário se cadastra no modo tradicional (Login >> cadastro)
  • O usuário se cadastra antes de finalizar uma compra (COMPRE! >> Finalizar compra >> Não possui cadastro? >> Cadastre-se aqui)

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 '/'.

Erro de Compilação

Descrição: Erro ao compilar um recurso necessário para atender esta solicitação. Examine os detalhes específicos do erro e modifique o código fonte apropriadamente.

Mensagem de Erro do Compilador: CS0246: Nome de espaço para nome ou tipo 'Pessoa' não pôde ser encontrado. Precisa de uma diretiva using ou de uma referência de conjunto de módulos (assembly)?

Erro de Origem:

 
Linha 18:     protected void calcularButton_Click(object sender, EventArgs e)
Linha 19: {
Linha 20: Pessoa calcular = new Pessoa();
Linha 21: calcular.Nome = NOME.Value.ToString();
Linha 22: calcular.Idade = Convert.ToInt32(IDADE.Value.ToString());

Arquivo de Origem: d:aspnet esteDefault.aspx.cs    Linha: 20

 

 

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.

2010 - Leonardo Breda