Armazenar imagens em um .DBF.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Armazenar imagens em um .DBF.

Mensagem 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.
Editado pela última vez por Itamar M. Lins Jr. em 03 Jul 2024 23:01, em um total de 1 vez.
Razão: O presente tópico foi movido da seção CA-Clipper, uma vez que seu conteúdo não tem relação com os objetivos daquela seção, onde só podem constar dúvidas técnicas de programação diretamente relacionadas com o Clipper.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Armazenar imagens em um .DBF.

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Armazenar imagens em um .DBF.

Mensagem 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á.
Anexos
bitmap.zip
(548.87 KiB) Baixado 125 vezes
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem por Itamar M. Lins Jr. »

Olá!
Seu código está errado.
Não é problema do LetoDbf.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem por Itamar M. Lins Jr. »

Olá!
HB_Base64EncodeFile() não achei nem no xHarbour nem no Harbour.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Armazenar imagens em um .DBF.

Mensagem por JoséQuintas »

No fonte postado tem erro de principiante, não funcionaria nunca.
Comece corrigindo o que se refere ao nome do arquivo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Armazenar imagens em um .DBF.

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Armazenar imagens em um .DBF.

Mensagem 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>
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Armazenar imagens em um .DBF.

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Armazenar imagens em um .DBF.

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Armazenar imagens em um .DBF.

Mensagem 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.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Responder