PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 25 → WX - Trabalhando com Byte Array
WX - Trabalhando com Byte Array
Iniciado por adrianoboller, jun., 04 2016 1:21 AM - 10 respostas
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em junho, 04 2016 - 1:21 AM
Prezados,

Estarei passando um exemplo aqui para ler um arquivo pdf em uma matriz de bytes.

A linguagem WL, permite fazer a leitura de um arquivo pdf.

//LENDO UM ARQUIVO PDF E SALVANDO EM DISCO
sAuxis string

sDocumentTitleis string

MyBufferis Buffer

sDocumentTitle= fExtractPath( sAux, fFileName )

MyBuffer= fLoadText( sAux )

fSaveText("TEST.PDF", myBuffer )

//TESTE O ARQUIVO GERADO: TEST.PDF




LEITURA DE BYTE ARRAY
//EXEMPLO

MyBuffer is Buffer = fLoadBuffer("TEST.PDF")

//Agora você pode cortar buffer f.i.

slice is Buffer = MyBuffer [[1 TO 8]] // leia o primeiro 8 bytes

// OR ...se preferir um array de bytes

n is int = Length(MyBuffer)

fileArr is array of n byte

FOR i = 1 TO n

fileArr[ i ] = MyBuffer[[ i ]]

END

//A variável fileArr tem o conteúdo lido.



Como pode ser visto no código, eu salvo na variável buffer para um arquivo com extensão pdf e depois que eu posso ler esse arquivo sem erros em qualquer leitor de PDF. Posso entao usar o comando Crypt para serializar o buffer em uma grande string de caracteres, letras e números e enviar via webservice. E com UnCrypt no outro lado remonto o buffer para ter o arquivo pdf e assim conseguimos fazer algo muito parecido com o Teletransporte do filme Star Trek. kkkk...





Crypt:
http://help.windev.com/en-US/…
// Encode a string in base 64
bufBase64 isbuffer = Crypt(bufToEncode, "", compressNone + cryptNone, encodeBASE64)


Uncrypt:
http://help.windev.com/en-US/…
// Declare and initialize the variables
StringToEncrypt is string = "The number of my account in Switzerland is 74538290"
Password is string = "JamesBond007"
EncryptedString is string
DecryptedString is string
// Encrypt the message
EncryptedString = Crypt(StringToEncrypt, Password, cryptSecure)
// Send the message by email for example
...
// Decrypt the message later
DecryptedString = Uncrypt(EncryptedString, Password, cryptSecure)
Info("The encrypted message meant: " + DecryptedString)


Assim eu posso usando os comandos acima enviar o buffer (byte array) com o formato de um bloco de texto para um webservice. E ainda posso fazer com que o webservice responda de volta: Arquivo PDF inválido ou válido.

Espero que o exemplo ajude a comunidade a produzir novos exemplos e novas soluções.

Forte abraço

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em março, 24 2020 - 11:33 PM
Prezados

Esse assunto é muito solicitado e vou passar umas orientações adicionais

No lado do servidor na tabela de cadastro de produtos pense em ter os seguintes campos:

IdProduto
NomeProduto
ImagemGrande binário
ImagemThumbs binário
ImagemGrandeZipada binário
ImagemThumsZipada binário

Ao gravar uma imagem de um produto
Salvar a imagem com 80% no campo ImagemGrande
Salvar essa mesma imagem redimensionando para um tamanho menor para ImagemThumbs
Zipar o buffer e salvar o binário ImagemGrandeZipada
Zipar o buffer e salvar o binário ImagemThumsZipada

Quando o Webservice requisitar o produto tem as duas imagens zipadas e salvas em 80% é reduzida para Thumbs
A requisição não terá o tempo de processamento de zipar para entregar ao celular que requisitou a informação
Ao chegar no celular pelo Webservice faz a descompactacao e salvamento da informação na tabela Hfsql Classic as duas imagens

Esse procedimento agiliza o download e garante a exibição dos dados mesmo em off-line.

Espero ter ajudado com essa sugestão

Um forte abraço a todos

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em abril, 10 2020 - 2:26 PM
Ou use

Bufimage is buffer = dliadbuffer( « imagem.jpg »)


ImagemString is string = encode(bufimagem, base64)

Reverso

ImagemBuff us buffer = decode(bufimagem, base64)

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em abril, 27 2020 - 8:56 PM
Boa tarde...

Nossos clientes as vezes mandam protocolos impressos e gostaria de digitalizar e gravar no HFSQL.

Qual seria o melhor método?

Gravar a imagem dentro do banco ou criar um link das imagem em uma pasta?

Alguém tem exemplo disso ?

Tudo depende do teu gosto as duas funcionam (base binária ou link ftp httprequest)

O campo binário do Hfsql é muito bom


Como eu faço:

- Crio uma tabela t001_pessoas E nela crio os campos Mas não coloco o binário nessa tabela da foto Crio outra tabela t002_pessoas_fotos

Relaciono e coloco o campo binário Isso não vai deixar lento vai funcionar ok e o tamanho do buffer da imagem vai para essa tabela

Funciona muito bem não diminui velocidade de consulta

Só vai transitar na rede a foto somente quando pedir ela

Se der um select *
não terei o buffer da foto transitando na rede sem motivo

Eu acho que é o mais lógico

Se for com link terá que fazer um http request além de um select

Será mais complexo, mas vai funcionar

Serão 4 operações e com a tabela binária, reservar o link numa variável e consultar com httprequest e depois um httpgettesult.

E um select com inner join 2 operação tem o resultado em um buffer ou em um array de string encode64 que terá que converter para buffer

Guardar no banco terá um consumo a mais de espaço, mas é bem simples e garantido :-)

Se for link se for ip e trocou para DNS ou para outro ip ou DNS daí o link ficou inútil, não vai baixar :-(

OK

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em abril, 28 2020 - 4:46 AM
Exemplo Download

https://depot.pcsoft.fr/resource.awp…

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em março, 08 2021 - 4:56 PM
PROCEDURE WSObterListaMensagens()
//Importar mensagens aluno//

NextTitle("")
HourGlass() // criando load

url is string = ""+gsUrlBackend+"/WSListarMensagens.rule?sys=EDU&alunoID="+gloAluno_id_externo+""

IF HTTPRequest(url) = True

gvRetornoMsg = JSONToVariant(HTTPGetResult())

IF gvRetornoMsg.status = "OK" THEN

x is int

vTotal is int = gvRetornoMsg.mensagens..Count

LOOP(vTotal)

x++

HReset(tab_mensagens)
IF HReadSeek(tab_mensagens,msg_chave_externa,gvRetornoMsg.mensagens[x].chave_externa,hIdentical) = False THEN

bufFotoMsg1 is Buffer = Decode(gvRetornoMsg.mensagens[x].img_mensagem, encodeBASE64)

imageFoto is Image = bufFotoMsg1

dSaveImageJPEG(imageFoto,fCurrentDir()+"\imagemfoto.jpg", 80) // 80% de compressao da imagem

bufFotoMsg2 is Buffer = fLoadBuffer(fCurrentDir()+"\imagemfoto.jpg") //pega o arquivo modificado o tamanho

//5000kb para 600kb mantendo a qualidade

HReset(tab_mensagens)
HReadSeek(tab_mensagens,msg_chave_externa,gvRetornoMsg.mensagens[x].chave_externa,hIdentical)

tab_mensagens.msg_chave_externa = gvRetornoMsg.mensagens[x].chave_externa
tab_mensagens.alu_chave_externa = gvRetornoMsg.mensagens[x].id_aluno
tab_mensagens.alu_instituicao_id = gvRetornoMsg.mensagens[x].id_instituicao
tab_mensagens.msg_nome_remetente = gvRetornoMsg.mensagens[x].nome_remetente
tab_mensagens.msg_assunto = gvRetornoMsg.mensagens[x].assunto
tab_mensagens.msg_conteudo = gvRetornoMsg.mensagens[x].conteudo
tab_mensagens.msg_fotografia_msg = bufFotoMsg2 //pronto
tab_mensagens.msg_resposta_sim = gvRetornoMsg.mensagens[x].resposta_sim
tab_mensagens.msg_resposta_nao = gvRetornoMsg.mensagens[x].resposta_nao
tab_mensagens.msg_resposta_talvez = gvRetornoMsg.mensagens[x].resposta_talvez
tab_mensagens.msg_dh_cadastro = gvRetornoMsg.mensagens[x].dh_cadastro

IF HAdd(tab_mensagens) = True THEN // Adiciona mensagem
//Info("Gravou com sucesso!")

ELSE

Error(ErrorInfo(), HErrorInfo())

END

// ELSE
//
// HReset(tab_mensagens)
// HReadSeek(tab_mensagens,msg_chave_externa,gvRetornoMsg.mensagens[x].chave_externa,hIdentical)
//
// bufFotoMsg is Buffer = Decode(gvRetornoMsg.mensagens[x].img_mensagem, encodeBASE64)
//
// tab_mensagens.msg_chave_externa = gvRetornoMsg.mensagens[x].chave_externa
// tab_mensagens.alu_chave_externa = gvRetornoMsg.mensagens[x].id_aluno
// tab_mensagens.alu_instituicao_id = gvRetornoMsg.mensagens[x].id_instituicao
// tab_mensagens.msg_nome_remetente = gvRetornoMsg.mensagens[x].nome_remetente
// tab_mensagens.msg_assunto = gvRetornoMsg.mensagens[x].assunto
// tab_mensagens.msg_conteudo = gvRetornoMsg.mensagens[x].conteudo
// tab_mensagens.msg_fotografia_msg = bufFotoMsg
// tab_mensagens.msg_resposta_sim = gvRetornoMsg.mensagens[x].resposta_sim
// tab_mensagens.msg_resposta_nao = gvRetornoMsg.mensagens[x].resposta_nao
// tab_mensagens.msg_resposta_talvez = gvRetornoMsg.mensagens[x].resposta_talvez
// tab_mensagens.msg_dh_cadastro = gvRetornoMsg.mensagens[x].dh_cadastro
//
// IF HModify(tab_mensagens) = True THEN // Atualiza mensagem
// //Info("Atualizado com sucesso!")
//
// ELSE
// Error(ErrorInfo(), HErrorInfo())
//
// END
//
END

END

ELSE

ToastDisplay(gFontBold() + gFont("Arial") + gFontSize(8) + ...
gPen(RGB(255,255,255)) + gvRetornoMsg.Erro, ...
toastShort, vaBottom, haCenter)

END

ELSE

//Mensagem quando não há conexão com servidor//
ToastDisplay(gFontBold() + gFont("Arial") + gFontSize(6) + ...
gPen(RGB(255,255,255)) + "Ops! Sem resposta do servidor!", ...
toastShort, vaBottom, haCenter)

END

Multitask(-1)
HourGlass(False) //Remomendo load
NextTitle("") // Titulo fim load


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em março, 09 2021 - 2:56 PM
PROCEDURE RedimencionarFoto(ImgOriginal)

bufFoto is Buffer

Foto is Image = ImgOriginal

IF Length(ImgOriginal) > 0

dSaveImageJPEG(Foto,fCurrentDir()+"\imagemfoto.jpg", IMG_PADRAO_AJUSTADA) // 80% de compressao

bufFoto = fLoadBuffer(fCurrentDir()+"\imagemfoto.jpg")

ELSE

fDelete(fCurrentDir()+"\imagemfoto.jpg",frReadOnly)

END

RETURN(bufFoto)


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em março, 09 2021 - 3:12 PM
Prezados,

Caso nao tenha foto, coloca uma foto na posicao negativa e atribui ela e descobre pelo tamanho do buffer se tem ou nao a foto num campo binario usando LENGTH > 0

PROCEDURE MyWindow(gMensagem_id)

QRY_MENSAGEM_SELECIONADA_ID.Parammsg_id = gMensagem_id

IF HExecuteQuery(QRY_MENSAGEM_SELECIONADA_ID) = True THEN

FOR EACH QRY_MENSAGEM_SELECIONADA_ID

// STC_DIA_MSG = QRY_MENSAGEM_SELECIONADA_ID.msg_dia_mensagem

IF Length (QRY_MENSAGEM_SELECIONADA_ID.msg_fotografia_msg) > 0 THEN

IMG_foto_mensagem = QRY_MENSAGEM_SELECIONADA_ID.msg_fotografia_msg

ELSE

IMG_foto_mensagem = IMG_sem_foto // sem foto

END

END

END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em março, 09 2021 - 3:16 PM
Lembre-se

1 - passar parametros a query para filtrar

2 - hexecutequery ou hexecutesqlquery dispara o camando

if true = para saber se deu certo o comando

exemplo

if hexecutequery(Qry_query) = true

else

end

3 - para ler o retorno tem que fazer um for each na query

if hexecutequery(Qry_query) = true

for each Qry_query
retorno = Qry_query.campo
end

else
info("Erro")
end

4 - para atualizar o looper ou table só depois disso tudo

tabledisplay(table_grid, tatinit)

se for looper

looperdisplay(loop_grid, tatinit)


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em março, 16 2021 - 10:57 PM




--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.317 mensagems
Popularité : +89 (91 votes)
Publicado em março, 16 2021 - 11:00 PM
Passos:

1 - criar var tipo imagem
2 - ler a imagem que esta no banco com dloadbuffer e armazenar na imagem de memoria
3 - dresize dimensionar o tamanho 800x600
4 - fsavebuffer salvar o que resultou no dresize em disco
5 - dsaveimagejpg salvar em 80%
6 - ler novamente o arquivo e converter ele de volta para imagem de memoria e buffer

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/