Manipulando campo do tipo blob com symfony (Parte 1-2)

Esses dias fiz um sistema que utilizava o tipo de campo BLOB para armazenar umas imagens.
Até então eu não sabia como fazer para manipular tais arquivos como BLOB.

Então, fiz da seguinte maneira:

Aplicação/Módulos


No meu exemplo de teste usei a aplicação “frontend” (symfony init-app frontend) e o módulo “arquivo” (symfony init-module frontend arquivo)

O schema.yml (config/schema.yml)



propel:
  arquivo:
    _attributes:       { phpName: Arquivo }
    id:
    img:               blob
    mime:              varchar(120)
    created_at:

O form


(apps/frontend/modules/arquivo/templates/indexSuccess.php)
<?php use_helper("Validation") ?>
<?php echo form_tag(‘arquivo/salvararquivo’ , ‘multipart=true’) ?>
<?php echo input_file_tag(‘arquivo’) ?>
<?php echo form_error(‘arquivo’); // esse helper é responsável por mostrar o erro de validação, caso exista ?>
<?php echo submit_tag(‘enviar’) ?>
</form>

OBS: Lembrar do MULTIPART=TRUE (fiquei um bom tempo até me lembrar de passar esse parâmetro).

Action – Recebo o arquivo do form


(apps/frontend/modules/arquivo/actions/actions.class.php)

    public function executeSalvararquivo() {
      $phpFile = $this->getRequest()->getFile(‘arquivo’); // pego o arquivo do form
      $fileType  = $this->getRequest()->getFileType(‘arquivo’); // pego o mimetype do arquivo
      $fileBinario = file_get_contents($phpFile["tmp_name"]); // pego o conteudo binario do arquivo

     $arquivo = new Arquivo();
     $arquivo->setImg($fileBinario); // esse é o campo BLOB
     $arquivo->setMime($fileType);
     $arquivo->save();
   }
   public function handleErrorSalvararquivo() {
     // esse metodo serve para retornar ao formulário caso algum erro seja encontrado
     $this->forward("arquivo" , "index");
   }

Validando o arquivo enviado


(apps/frontend/modules/arquivo/validate/salvararquivo.yml)

fillin:
  enabled:  true
fields:
  arquivo:
    file:  true
    required:
      msg:   É obrigatório o envio de uma imagem
    sfFileValidator:
      mime_types:
        – ‘image/jpeg’
        – ‘image/pjpeg’
      mime_types_error:  Apenas imagens do tipo JPG são válidas
      max_size:   20000
      max_size_error:  O tamanho máximo da imagem é de 20KB

Sucesso


(apps/frontend/modules/arquivo/templates/salvararquivoSuccess.php)

  Arquivo salvo com sucesso.

Perfeito. Temos agora um arquivo armazenado no banco de dados.

E para mostrar esse arquivo/imagem numa view ? Usaremos Components. Será a parte II desse post.

>>