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,
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%.
— Anderson Maciel 13 de Nov de 2019Usa a GzCompress()
e a GzStrDecomp()
para comprimir a informação que vai ser enviada.
Utilizei esse método e funcionou. Grato!
— André de Oliveira Lopes 23 de Jun de 2023Felipe, 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.
— Anderson Maciel 13 de Nov de 2019Consegue me mandar esse Parse que você fez?
— FELIPE CAIADO ALMEIDA 20 de Nov de 2019A 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 )
— Sergio Daniel Artero 14 de Jul de 2021oPA.. Valeu @Sergio Daniel
— Welinton Carioca 15 de Jul de 2021Olá 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!
— Lucas Fidélis 02 de Jun de 2021
Vim procurar exemplo disto também, estou desenvolvendo uma aplicação agora e estou testando o upload de arquivos com REST.
— Anderson Maciel 13 de Nov de 2019Anderson bom dia, se achar algum exemplo e puder me enviar, agradeço.
— FELIPE CAIADO ALMEIDA 13 de Nov de 2019Felipe, 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?
— Anderson Maciel 13 de Nov de 2019Ainda não. Como você está mandando o arquivo via REST? qual tipo de dado que você recebe no REST?
— FELIPE CAIADO ALMEIDA 13 de Nov de 2019O 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).
— Anderson Maciel 13 de Nov de 2019Vi 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.
— Anderson Maciel 13 de Nov de 2019