Como transferir arquivos via WebService em AdvPL

No artigo de hoje, vou mostrar como transferir arquivos via WebService com AdvPL (por exemplo, um pdf como danfe ou uma imagem).
Se você já precisou atender por algum motivo, disponibilizar um pdf de uma danfe, uma imagem ou qualquer outro arquivo vindo do Protheus para outro sistema, como fazer isso via WebService?

Basicamente pessoal, podemos fazer isso usando a codificação de Base 64. Então por exemplo, via AdvPL nós geramos a DANFE, o pdf do relatório ou buscamos a imagem. Ai iremos ler o conteúdo com FWFileReader e codificar ele para essa base. A partir disso teremos uma cadeia de caracteres que iremos enviar no retorno do WebService.

Exemplificando em AdvPL (usando SOAP):

// ... nesses comandos antes, você gera a danfe ou o pdf que você vai enviar

//Se o arquivo existir
If File(cPasta + cArqDanfe + ".pdf)
	//Tenta abrir o arquivo
	oFile   := FwFileReader():New(cPasta + cArqDanfe + ".pdf)
	If oFile:Open()
		cFileConteu     := oFile:FullRead()
		cFileEncode     := Encode64(cFileCont,, .F., .F.)
		
		//Define o retorno do webservice
		cDados := '  "Dados" : { '                       + CRLF
		cDados += '     "Danfe":"' + cFileEncode + '" '  + CRLF
		cDados += '  } '                                 + CRLF

		::cDanfeSend := "{" + CRLF
		::cDanfeSend += cDados
		::cDanfeSend += "}" + CRLF
	
	Else
		SetSoapFault('Erro', "Falha ao processar o pdf da Danfe")
		lRet := .F.
	EndIf
Else
	SetSoapFault('Erro', "Danfe não encontrada")
	lRet := .F.
EndIf

Agora na outra ponta, precisamos pegar essa string, e transformar ela em arquivo (pdf, imagem, etc). No nosso exemplo como é um pdf, iremos pegar essa string e transforma-la. Para exemplificar será usada a linguagem PHP, exibindo como pegar essa cadeia de caracteres e mostrar um prompt para download da danfe.

Então, exemplificando em PHP:

//aqui antes dos comandos, você se comunica com o WebService AdvPL

//Busca os Dados e depois a chave Danfe
$dados  = $jsonResult->Dados;
$encode = $dados->Danfe;

//Define o arquivo pdf que será gravado dentro da hospedagem temporariamente
$decoded = base64_decode($encode);
$file = "pdfs/" . $nf . "_" . $serie . ".pdf";
file_put_contents($file, $decoded);

//Se conseguir gravar o pdf, define o header do navegador para mostrar um prompt de download
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta