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.