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 4 weeks agoUsa a GzCompress()
e a GzStrDecomp()
para comprimir a informação que vai ser enviada.
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.
— Anderson Maciel 4 weeks agoConsegue me mandar esse Parse que você fez?
— FELIPE CAIADO ALMEIDA 3 weeks ago
Vim procurar exemplo disto também, estou desenvolvendo uma aplicação agora e estou testando o upload de arquivos com REST.
— Anderson Maciel 4 weeks agoAnderson bom dia, se achar algum exemplo e puder me enviar, agradeço.
— FELIPE CAIADO ALMEIDA 4 weeks agoFelipe, 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 4 weeks agoAinda não. Como você está mandando o arquivo via REST? qual tipo de dado que você recebe no REST?
— FELIPE CAIADO ALMEIDA 4 weeks agoO 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 4 weeks agoVi 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 4 weeks ago