segunda-feira, 25 de março de 2013

Genexus - Capturar Blob File Name

Quando trabalhamos com arquivos do tipo Blob (Binay large object), nos deparamos com situações onde devemos armazenar, em atributos ou variáveis, o nome e a extensão original do arquivo informado.

Trabalhando com Atributos

Ao trabalharmos com atributos isso pode ser realizado de uma forma bem simples. Por exemplo, em uma transação teremos 3 variáveis:
  1. File - blob;
  2. FileName - varchar(40);
  3. FileType - varchar(5);
Para gravarmos o nome e a extensão original do arquivo selecionado pelo usuário, devemos definir nas propriedades do atributo File (blob) as seguintes características:

Genexus Blob

Trabalhando com Variáveis

Um dos problemas em se trabalhar com variáveis do tipo Blob, é a falta de uma função para capturarmos o nome original do arquivo.

Por exemplo, quando o usuário da nossa aplicação deseja enviar algum arquivo via FTP ou Email, somos obrigados a gravar este arquivo em uma tabela para dessa forma, obtermos o nome original deste. Caso essa gravação não seja realizada, o arquivo enviado pelo usuário, automaticamente, é aberto na pasta "Temp media directory", que por padrão é a pasta "PublicTempStorage", e, recebe um nome aleatório.

Neste post irei demonstrar como podemos obter o nome original deste arquivo através da biblioteca Jquery.

Em uma Web Panel, adicionei à tela, duas variáveis e um botão. As variáveis definidas foram:
  1. &Blob - blob;
  2. &FileName - Varchar(40)
Agora precisamos programar a função em Jquery que irá executar esta captura do nome original. Para isso, utilizei a função "blur". Esta função é justamente o oposto da função "focus", ou seja, quando a variável blob perder o foco, o procedimento irá se executar. Vejamos:

Event Start
//=====Adiciona a biblioteca Jquery=====
Form.JScriptSrc.Add('http://code.jquery.com/jquery-latest.js">')

//=====Inicio do Script=====
Form.HeaderRawHTML = '<script type="text/javascript">'
Form.HeaderRawHTML += '$(document).ready(function(){'

//=====Quando a variável Blob perder o foco, executa=====
Form.HeaderRawHTML += '$("#vBLOB").blur(function(){'
Form.HeaderRawHTML += 'var nome = $("#vBLOB").val();'
Form.HeaderRawHTML += 'nome = nome.match(/[-_\w]+[.][\w]+$/i)[0];'

//=====Define o valor da variavel File name=====
Form.HeaderRawHTML += '$("#vFILENAME").val(nome);'
Form.HeaderRawHTML += '});'
Form.HeaderRawHTML += '});'
Form.HeaderRawHTML += '</script>'
EndEvent

Mais uma ótima utilização de Jquery, qualquer dúvida o email genexus@outlook.com é ótimo para receber qualquer coisa. Abraço.

7 comentários:

  1. Parabéns pela solução e muito obrigado, me ajudou bastante na mesma situação em que eu precisava gravar o nome dos arquivos da variável Blob do webpanel no momento do upload. Apenas adicionei passos para no evento Enter quebrar com substring a variável &FileName em filename e filetype, e junto com o Blob adicioná-los no banco conforme precisava através de Business Component. []'s

    ResponderExcluir
  2. Muito bom, e PARABÉNS ... nota 10, valeu pela ajuda!!!

    ResponderExcluir
  3. Estou trabalhando com variavel, e para mim retornou vazio, mesmo assim obrigado!

    ResponderExcluir
  4. Muito útil. O colega Felipe Neves que indicou seu artigo. Vocês me salvaram do flash para upload.

    ResponderExcluir
  5. Este comentário foi removido pelo autor.

    ResponderExcluir
  6. Form.HeaderRawHTML += 'nome = nome.match(/[-_ \w]+[.][\w]+$/i)[0];'
    Para incluir arquivos onde tem espaço entre os nomes resolvi colocando um espaço após o simbolo _
    Agora como faço para incluir as acentuações, pois quando tenho arquivos com acentuação ele corta o nome a partir da acentuação, tipo "Atualização 2019.pdf" ele retorna "o 2019.pdf" ?

    ResponderExcluir
    Respostas
    1. Form.HeaderRawHTML += 'nome = nome.match(/[A-Za-zÀ-ú0-9-_ \w]+[.][\w]+$/i)[0];'

      Excluir