Página 1 de 2
Armazenar imagens em um .DBF.
Enviado: 03 Jul 2024 15:01
por Linguagemclipper
Estou tentando fazer isso pra resolver um relatorio com logotipo por conta do LETODBF...
Comigo não funcionou, mas sem o LETODBF() já testei e deu certo.
É ó codificar a imagem binária em texto codificado com base64:
Código: Selecionar todos
cARQBMP := LOWER(ALLTRIM(UG->LOGOTIPO))
IF FILE(cARQBMP)
// TRANSFORMA ARQUIVO BITMAP EM ARQUIVO DE TEXTO CODIFICADO EM BASE64
HB_Base64EncodeFile( cARQBMP, "base64bmp.enc" )
// SALVA IMAGEM NO BANCO DE DADOS
REPLACE UG->LOGOBMP WITH MEMOREAD("base64bmp.enc")
ENDIF
Depois para gravar a imagem de volta em qualquer computador que o sistema estiver rodando:
Código: Selecionar todos
* CERTIFICA QUE A LOGO DO RELATÓRIO CONSTA NA PASTA DO EXECUTÁVEL
cLOGO := ALLTRIM( LOWER(UG->LOGOTIPO) ) // NOME DO BITMAP QUE DEVE ESTAR NA MESMA PASTA DO SISTEMA
IF !FILE( cLOGO )
bFILE := HB_base64decode(UG->LOGOBMP)
MEMOWRIT(cLOGO, bFILE)
ENDIF
Testei com xHarbour. O HB_Base64DecodeFile() não funcionou, só deu com memowrit() mesmo.
Armazenar imagens em um .DBF.
Enviado: 04 Jul 2024 01:39
por rochinha
Amiguinhos,
LinguagemClipper
Quando fiz testes de embutir imagens em campos memo eu renomeava os arquivos para .TXT e puxava com MemoRead() e depois para visualizar salvava com MemoWrit() e renomeava novamente para .JPG. Só usava JPG ja que por preguiça não verifiquei uma forma de salvar se era PNG, TIFF, PCX, etc para saber qual extensão recuperar.
Tempos depois fiz uns testes de guardar arquivos .ZIP em campos memo usando a mesma técnica.
O problema é o inchaço das tabelas e a fragilidade do .DBT/.FPT
Camo com Harbour/xHarbour aquele limite de tamanho de 255 do campo caracter foi suplantado pode-se abandonar memos e ter uma tabela só para este recurso.
Agora de você tiver acesso ao código do HB_Base64EncodeFile() do Harbour pode compará-lo ao Base64EncodeFile() do xHarbour e ver suas peculiaridades para entender porque atuam diferentes.
Armazenar imagens em um .DBF.
Enviado: 04 Jul 2024 15:18
por Itamar M. Lins Jr.
Olá!
Pra salvar imagens o DBF precisa ter o FIELD BLOB.
...
Quando fiz isso, coloquei em uma pasta(especifica) dai não usei BLOB.
Tem muitos exemplos na internet de como fazer.
Mais na frente vou ativar isso novamente no sistema, por conta de usar mod_harbour ou uHTTP(já uso) num futuro...
Tabelas com imagens em HTML são muito rápidas.
Problema é usar isso em rede mapeada, pq dependendo do tamanho dos BITMAPS(imagens) degrada a rede.
Saudações,
Itamar M. Lins Jr.
Armazenar imagens em um .DBF.
Enviado: 04 Jul 2024 17:15
por Linguagemclipper
Pessoal, essa rotina funciona normalmente se não estivesse usando um servidor de banco de dados, a questão é essa.
Testei inclusive com DBF, salvando no memo e depois em bitmap de volta, funciona.
A questão é que não está funcionando com o servidor de banco de dados LetoDBf. Se ele lê o arquivo numa variável então porque não salva no DBF lá no servidor se o conteúdo está na memória?
Lá no cadastro da instituição:
Código: Selecionar todos
// GRAVA DADOS
UG->(LOCKREG())
UG->NOME := cUG
UG->FILIAL := cFI
UG->ENDERECO := cEND
UG->BAIRRO := cBAI
UG->CIDADE := cCID
UG->COMPLEMENT := cCOM
UG->UF := cUF
UG->CEP := cCEP
UG->TELEFONE := cTEL
UG->FAX := cFAX
UG->CNPJ := cCNPJ
UG->IE := cIE
UG->LOGOTIPO := cLOGO
UG->LOGOW := nLOGOW
UG->LOGOH := nLOGOH
cARQBMP := LOWER(ALLTRIM(UG->LOGOTIPO))
IF FILE(cARQBMP)
// TRANSFORMA ARQUIVO BITMAP EM ARQUIVO DE TEXTO CODIFICADO EM BASE64
HB_Base64EncodeFile( cARQBMP, "base64bmp.enc" )
// SALVA IMAGEM NO BANCO DE DADOS
REPLACE UG->LOGOBMP WITH MEMOREAD("base64bmp.enc")
ENDIF
No programa inicial antes do MENU principal:
Código: Selecionar todos
* CERTIFICA QUE A LOGO DO RELATÓRIO CONSTA NA PASTA DO EXECUTÁVEL
cLOGO := ALLTRIM( LOWER(UG->LOGOTIPO) ) // NOME DO BITMAP QUE DEVE ESTAR NA MESMA PASTA DO SISTEMA
IF !FILE( cLOGO )
bFILE := HB_base64decode(UG->LOGOBMP)
MEMOWRIT(cLOGO, bFILE)
ENDIF
Já coloquei MEMOWRIT(cLOGO, HB_base64decode(UG->LOGOBMP)) e não funcionou.
A questão é que o campo UG->LOGOBMP está vazio.
O usuário que cadastrou a logo tem ele no computador e salvou com o "base64bmp.enc", se eu ler em variável ele mostra o conteúdo, mas se eu tento salvar essa variável no campo memo também dá erro.
Quero ter só o aplicativo no computador e a variável de ambiente definida com o IP do servidor, mas pelo visto vai ter que ficar o bitmap também, se quiser que saia logotipo nos relatórios.
Isso tudo porque Win32BMP() não está lendo o bitmap que está na mesma pasta dos DBFs lá no servidor, oBmp:loadFile( LOWER(cARQ_BMP) ) não lê o bitmap que está lá.
Armazenar imagens em um .DBF.
Enviado: 04 Jul 2024 17:19
por Itamar M. Lins Jr.
Olá!
Seu código está errado.
Não é problema do LetoDbf.
Saudações,
Itamar M. Lins Jr.
Armazenar imagens em um .DBF.
Enviado: 04 Jul 2024 17:25
por Itamar M. Lins Jr.
Olá!
Código: Selecionar todos
REPLACE UG->LOGOBMP WITH HB_Base64EncodeFile( cARQBMP, "base64bmp.enc" )
A função Memoread() lê arquivo no "DISCO" não lê string em RAM.
Return the contents of a disk file as a character string -> MemoRead() is a memo function that reads a disk file into memory
Saudações,
Itamar M. Lins Jr.
Armazenar imagens em um .DBF.
Enviado: 04 Jul 2024 17:35
por Itamar M. Lins Jr.
Olá!
Mais outro erro!
Código: Selecionar todos
cARQBMP := LOWER(ALLTRIM(UG->LOGOTIPO))
IF FILE(cARQBMP)
Usando função FILE() para field ? Não seria -> "!empty()"
Só se ai tem o PATH com o arquivo! E se não está lá no servidor LETODBf, mais outro problema. Tá na estação ? Tá no FIELD do DBF ou tá no servidor ? Se decida ai.
Saudações,
Itamar M. Lins Jr.
Armazenar imagens em um .DBF.
Enviado: 04 Jul 2024 18:02
por Itamar M. Lins Jr.
Olá!
Parece que a sintaxe que vc está usando da hb_base64encode() está errada também
HB_Base64Encode ()
Encodes a character string base 64 .
syntax
HB_Base64Encode ( <cstring> , <nBytes> ) - > cBase64
Veja isso também. Segundo parâmetro é a quantidade de caracteres que tem a string.(opcional) Usar LEN() para ter a quantidade correta.
Saudações,
Itamar M. Lins Jr.
Armazenar imagens em um .DBF.
Enviado: 04 Jul 2024 18:05
por Itamar M. Lins Jr.
Olá!
HB_Base64EncodeFile() não achei nem no xHarbour nem no Harbour.
Saudações,
Itamar M. Lins Jr.
Armazenar imagens em um .DBF.
Enviado: 05 Jul 2024 09:07
por JoséQuintas
No fonte postado tem erro de principiante, não funcionaria nunca.
Comece corrigindo o que se refere ao nome do arquivo.
Armazenar imagens em um .DBF.
Enviado: 05 Jul 2024 09:47
por JoséQuintas
Depois que acertar nome de arquivo, se não funciona base64 é só usar hexadecimal.
Não pode deixar codepage interferir no conteúdo.
Armazenar imagens em um .DBF.
Enviado: 05 Jul 2024 10:28
por alxsts
Olá!
Itamar M. Lins Jr. escreveu:HB_Base64EncodeFile() não achei nem no xHarbour nem no Harbour.
HB_Base64EncodeFile()
Encodes a file base 64.
Syntax
HB_Base64EncodeFile( <cFilename>, <cBase64File> ) --> NIL
Arguments
<cFilename>
This is a character string holding the name of the file to encode.
<cBase64File>
This is a character string holding the name of the file where base 64 encoded data is written to. Return
The return value is always NIL.
Description
HB_Base64EncodeFile() reads an entire file, encodes it base 64, and writes the encoded data into a second file.
Info
See also: HB_Base64Decode(), HB_Base64DecodeFile(), HB_Base64Encode()
Category: Encoding/Decoding , xHarbour extensions
Source: tip\encoding\Base64.c
LIB: xhb.lib
DLL: xhbdll.dll
Example
Código: Selecionar todos
// The example outlines base 64 encoding and decoding of files.
// A PRG file is encoded in a second file which is decoded into
// a third file. The contents of the original and third file are
// identical.
PROCEDURE Main
LOCAL cFileIn := "HB_Base64.prg"
LOCAL cFileOut := "HB_Base64.enc"
HB_Base64EncodeFile( cFileIn, cFileOut )
HB_Base64DecodeFile( cFileOut, "Test.txt" )
? Memoread( cFileIn ) == MemoRead( "Test.txt" ) // Result: .T.
RETURN
--------------------------------------------------------------------------------
Copyright © 2006-2007 xHarbour.com Inc. All rights reserved.
Fonte: xHarbour Language Reference Guide
C:\hb32\bin>hbmk2 -find HB_Base64EncodeFile
sem resultados
C:\hb32\bin>
Armazenar imagens em um .DBF.
Enviado: 12 Jul 2024 13:02
por clodoaldomonteiro
Uma coisa q percebi, é que a função MemoWrit() grava uma determinada String e adiciona um caractere no fim, acho que [SUB], então quando vc recebe o texto em base64, converte ele em string e grava com MemoWrit(), tende a mudar o conteúdo do arquivo. Aconselho a usar fCreate() para salvar, pois garante q não vai ter surpresas no conteúdo do arquivo.
Abraços.
Armazenar imagens em um .DBF.
Enviado: 12 Jul 2024 13:19
por JoséQuintas
clodoaldomonteiro escreveu:Uma coisa q percebi, é que a função MemoWrit() grava uma determinada String e adiciona um caractere no fim, acho que [SUB]
MemoWrit() é compatível com Clipper/Dos
hb_MemoWrit() não grava o Control-Z que indica fim de arquivo para o DOS.
Como curiosidade, no Xharbour o MemoWrit() tem um terceiro parâmetro pra isso.
Armazenar imagens em um .DBF.
Enviado: 06 Set 2024 14:15
por Linguagemclipper
Tem algum principiante aí que conseguiu compilar o meu código e ver que funciona? Porque os mestres daqui descobriram um monte de erro compilando só na cabeça, não tão inteligentes que nem precisam compilar no computador.