Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Gravando imagem no banco de dados Olá colegas. Eu precisei gravar uma imagem dentro de um campo blob, mas não encontrei exemplo de como fazer isso no adianti. Segue a forma como resolvi. Talvez não seja a melhor forma, mas pelo menos resolveu meu problema. Caso algum colega saiba de uma melhor forma de resolver o problema, por gentileza coloque aqui. A ideia é sempre usar um arquivo de imagem, antes de gravar no banco, ou...
EL
Gravando imagem no banco de dados  
Olá colegas.
Eu precisei gravar uma imagem dentro de um campo blob, mas não encontrei exemplo de como fazer isso no adianti.
Segue a forma como resolvi. Talvez não seja a melhor forma, mas pelo menos resolveu meu problema.
Caso algum colega saiba de uma melhor forma de resolver o problema, por gentileza coloque aqui.
A ideia é sempre usar um arquivo de imagem, antes de gravar no banco, ou até mesmo antes de renderizar na tela.
Esse arquivo fica numa pasta temporaria, e será apagado depois de certo tempo.
O unico incoveniente é que, toda vez que o registro é editado, um novo arquivo temporario é criado. Logo, a pasta "tmp" vai enchendo. Por isso que eu preciso apagar os arquivos temporarios. Se alguem tiver uma ideia melhor, posta aqui.


Na classe active Record tive que fazer o seguinte: Criei um campo virtual "imagem" que irá receber o caminho do arquivo temporario através de um metodo magico.

  1. <?php
  2. class MinhaClasse extends TRecord
  3. {
  4.        
  5.     const TABLENAME 'minha_tabela';
  6. ...
  7. ...
  8.     
  9.     private $imagem// esta variavel sera usada para conversao
  10.     
  11.     public function __construct($id NULL$callObjectLoad TRUE)
  12.     {
  13.       ...
  14.       parent::addAttribute('campo_blob_do_banco');
  15.        ...
  16.      }
  17.     // este metodo magico sera usado para pegar a imagem que ja esta no banco. Inicialmente ele grava essa imagem num arquivo temporario.
  18. // Ele tambem apaga imagens antigas.
  19. // 
  20. public function get_imagem()
  21.    {
  22.     if (!empty($this->img_brasao)) {
  23.         // apagando arquivos antigos
  24.         $dir getcwd()."/tmp/";
  25.         $tempo 3600;
  26.         /*** percorrendo todos os arquivos da pasta ***/
  27.         foreach (glob($dir."*.jpg") as $file) {
  28.             /*** 3600  = 1hora, 86400=24horas ***/
  29.             if(time() - filectime($file) > $tempo
  30.             {
  31.                 unlink($file);
  32.             }
  33.         }
  34.         // gerando um nome unico
  35.         $tmpfile md5(date('Y-m-d H:i:s:u'));
  36.         $output_file getcwd()."/tmp/{$tmpfile}.jpg";
  37.        // gravando o campo blob para um arquivo
  38.         file_put_contents($output_file$this->campo_blob_do_banco);        
  39.         return $output_file;
  40.     } else return NULL;
  41.    }
  42. ?>



Na classe TPage de edição, onde a imagem será mostrada, eu resolvi usar um TImageCropper para pegar o campo virtual e mostrar na tela. Caso o usuario deseje selecionar outra imagem para ser gravada no banco, esse mesmo campo será usado para armazenar o local onde a imagem foi gravada.

  1. <?php
  2. class MinhaClasseForm extends TPage
  3. {
  4. private $form;
  5.   public function __construct$param$embbed=false )
  6.     {
  7.         parent::__construct();
  8.        ...
  9.       ...
  10.         // Aqui estou pegando informacao daquele metodo magico get_imagem
  11.         $img_brasao = new TImageCropper('imagem');
  12.         $img_brasao->setAllowedExtensions( [ 'png''jpg''jpeg'] );
  13.         $img_brasao->setSize(100200);        
  14.         $img_brasao->enableFileHandling();        
  15.         $row $this->form->addFields( [ new TLabel('Brasão') ,  $img_brasao ] );
  16. ...
  17. ...
  18. // No momento de gravar o formulario, fazer o tratamento da imagem
  19.     public function onSave$param )
  20. {
  21. ...
  22. ...
  23.             $data $this->form->getData(); 
  24.             $object = new $this->activeRecord;  
  25.             $object->fromArray( (array) $data); 
  26.             // Tratando a imagem antes de gravar no banco
  27.             $nm   json_decode(urldecode($data->imagem)); 
  28.             $file getcwd().'/tmp/'basename$nm->fileName );
  29.             $img  file_get_contents($file);
  30.             $object->campo_blob_do_banco$img;
  31.             $object->store(); 
  32. ?>



Editado 11/02/2024 (há 2 meses) - Clique para ver alterações

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (1)


PD

Emilio,

Sugiro repensar e avaliar a possibilidade de gravar imagens nos sistema de arquivos e manter somente a referência para ela no banco de dados. Isso facilita backups (dumps), performance e outras coisinhas mais.

Att,