Bom dia,
Alguém tem algum exemplo de serviço REST desenvolvido em ADVPL para receber o upload de arquivo?
Abraço,
Bom dia,
Alguém tem algum exemplo de serviço REST desenvolvido em ADVPL para receber o upload de arquivo?
Abraço,
Vim procurar exemplo disto também, estou desenvolvendo uma aplicação agora e estou testando o upload de arquivos com REST.
Anderson bom dia, se achar algum exemplo e puder me enviar, agradeço.
Felipe, estou procurando uma forma de fazer o upload ainda, ou melhor, de pegar o arquivo no serviço rest pois o envio é feito. Você conseguiu algo?
Ainda não. Como você está mandando o arquivo via REST? qual tipo de dado que você recebe no REST?
O rest não consegue manipular a requisição com conteúdo multipart/form-data, então ele joga o conteúdo todo no body, se voce der um conout no ::GetContent() vai ver o conteúdo todo em raw, inclusive o conteúdo do arquivo em binário (se for um).
Vi que uma das formas de se fazer seria encodar o arquivo com base64, enviar como json e decodar no backend, mais isso gera um aumento do payload de 33%, porém eu estou usando o envio pelo portinari e ele não me dá esta opção, o envio é feito como multipart/form-data mesmo.
Olá Felipe, vou exemplificar um processo que fiz e que funcionou. (Flutter -> REST ADVPL)
No código em flutter em um objeto de dicionário (que vamos aqui já simplificar para uma estrutura JSON) atribui em uma chave de nome logo64 o valor do processo de encode64 de um arquivo de imagem. Ou seja, transformei um arquivo em uma string de base64.
Logo o JSON da requisição ficou com o formato {"logo64": "iVBORw0KGgoAAAANSUhEUgAABC4AAALECAYAAADHIHF4AAAABHNCSVQICAgIf..."}.
No ADVPL fiz o seguinte processo:
//Transformando o body da requisição em objeto
cBodyJson := ::GetContent()
cBodyJson := EncodeUtf8(cBodyJson)
oBody := JsonObject():new()
oBody:fromJson(cBodyJson)
//Criando a logo
nHandLogo := fcreate("meu_caminho_para_salvar\imagem.png")
FWrite(nHandLogo, Decode64(oBody['logo64']))
fclose(nHandLogo)
Funções de encoding base64 estão presentes na maioria das linguagens de programação. Logo não será um problema no seu outro projeto.
Esperto ter ajudado!
Lucas, foi como mencionei acima que seria uma alternativa, porém isso gera um aumento do payload em 33%.
Usa a GzCompress()
e a GzStrDecomp()
para comprimir a informação que vai ser enviada.
Utilizei esse método e funcionou. Grato!
Felipe, não encontrei um meio padrão para capturar os arquivos no rest e fazer os tratamentos necessários, por fim acabei implementando um parsing no body da requisição para pegar o nome do arquivo e escreve-lo no sistema de arquivos, porém como foi feito em advpl, ficou bem lento para arquivos maiores de 5mb, 10mb.
Fiz a escrita em disco usando a classe FWFileWriter()
.
Complementando, da maneira que fiz ficou lento por causa do echo no console log do appserver, se tirar ele fica rápido.
Consegue me mandar esse Parse que você fez?
A minha situação é a seguinte: MEU ARQUIVO ORIGINAL É UMA IMAGEM .JPG que recebo de uma aplicação FLUTTER. Recebo o arquivo base64 que o Flutter converteu Consigo dar o Decode no ADVPL Gonsigo gravar no disco depois do DECODE Mas ao tentar abrir o arquivo, nenhum editor abre.
Welinton, tive o mesmo problema e descobri que (no meu caso) era a formatação da String em base 64, que vinha com alguns caracteres mal formatado, onde tive que realizar o tratamento no AdvPl antes de utilizar a função decode64. Segue parte do código que tratei e passou a aparecer corretamente a imagem:
// Tratamento de String Encode Base 64
cArqBase64 := StrTran( cArqBase64, “%2B”, “+” )
cArqBase64 := StrTran( cArqBase64, “%2F”, “/” )
FWrite( nHandle, Decode64( cArqBase64 ) )
FClose( nHandle )
oPA…
Valeu @Sergio Daniel
Olá pessoal, boa tarde,
Estou passando pelo mesmo problema, necessito mandar imagens para guarda-las em um servidor. A solução de vocês está em pleno funcionamento ?
Olá meu caro, a minha resposta acima segue funcionado aqui! Espero que ajude!