Atualize hoje para o Scriptcase 9 e ganhe 35% de desconto! Atualize hoje para o Scriptcase 9 e ganhe 35% de desconto! COMPRAR AGORA!

Autor Tópico: Rotina para Download de XML da NF-e  (Lida 172 vezes)

tuelito

  • Novato
  • *
  • Mensagens: 10
    • Email
Rotina para Download de XML da NF-e
« Online: Maio 17, 2017, 12:04:06 pm »
Bom dia a todos!

Fucei o fórum de ponta cabeça e não achei uma solução para o problema...se já tiver uma resposta me desculpem!

O que quero:
- Fazer o download do XML da NF-e que está armazenado no banco de dados.

Como estou fazendo:
- No SC criei uma tela do tipo Consulta onde está sendo listada as minhas NF-e. Aí possuo uma coluna chamada XML, onde criei a seguinte lógica (inclusive esta solução foi encontrada aqui no fórum) pra realizar o download do arquivo XML:
  • Evento onRecord:
    • $var_lnkXML = 'index.php?lnkXML='.{chave_acesso};
      {lnkXML}      = "<a href= $var_lnkXML >XML</a>";


  • onScriptInit:
    • Recupero o XML da NF-e, salvo ele numa pasta temporária (já verifiquei este arquivo antes de excluir e está salvando corretamente, ou seja, sem sujeira HTML), utilizo uma rotina chamada output_file (que o nosso amigo Haroldo disponibilizou no fórum a um tempo) e depois excluo esse arquivo.


  • Programação -> Métodos PHP -> função output_file:
    • $file_extension = strtolower(substr(strrchr($file,"."), 1));

      if( $file_extension == "php" ){
         die("Arquivo Inválido para Download.");
      }

      if( !is_readable($file) ){
         die("Arquivo não encontrado!");
      }

      $size = filesize($file);
      $name = rawurldecode($name);

      $known_mime_types = array(
         "pdf" => "application/pdf",
         "txt" => "text/plain",
         "html" => "text/html",
         "htm" => "text/html",
         "exe" => "application/octet-stream",
         "zip" => "application/zip",
         "doc" => "application/msword",
         "xls" => "application/vnd.ms-excel",
         "ppt" => "application/vnd.ms-powerpoint",
         "gif" => "image/gif",
         "png" => "image/png",
         "jpeg"=> "image/jpg",
         "jpg" => "image/jpg",
         "php" => "********"
      );


      if( $mime_type == "" ){
         if( array_key_exists($file_extension, $known_mime_types) ){
            $mime_type = $known_mime_types[$file_extension];
         }
         else{
            $mime_type = "application/force-download";
         }
      }

      @ob_end_clean();

      if( ini_get("zlib.output_compression") ){
         ini_set("zlib.output_compression", "Off");
      }

      header("Content-Type: ".$mime_type.";name=\'".$file."\'");
      header("Content-Disposition: attachment; filename=".$name);
      header("Content-Transfer-Encoding: binary");
      header("Accept-Ranges: bytes");
      header("Cache-control: private");
      header("Pragma: private");
      header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

      if( isset($_SERVER["HTTP_RANGE"]) ){
         list($a, $range)         = explode("=",$_SERVER["HTTP_RANGE"],2);
         list($range)             = explode(",",$range,2);
         list($range, $range_end) = explode("-", $range);
         $range                   = intval($range);

         if( !$range_end ){
            $range_end = $size - 1;
         }
         else{
            $range_end = intval($range_end);
         }

         $new_length = $range_end-$range + 1;
         header("HTTP/1.1 206 Partial Content");
         header("Content-Length: $new_length");
         header("Content-Range: bytes $range-$range_end/$size");
      }
      else{
         $new_length = $size;
         header("Content-Length: ".$size);
      }

      $chunksize  = 1 * (1024 * 1024);
      $bytes_send = 0;

      if ( $file = fopen($file, "r") ){
         if( isset($_SERVER["HTTP_RANGE"]) ){
            fseek($file, $range);
         }

         while( !feof($file) && (!connection_aborted()) && ($bytes_send<$new_length) ){
            //ob_clean();
              //flush();

            $buffer = fread($file, $chunksize);
            print($buffer);
            flush();
            $bytes_send += strlen($buffer);
         }
         fclose($file);
      }
      else{
         die("Erro - Não foi possível abrir arquivo.");
      }


Problema encontrado:
- Depois de fazer o download do arquivo XML e abrir ele, além de vir os dados da NF-e, está vindo sujeira da página em HTML, conforme exemplo abaixo (trecho retirado do arquivo XML depois de realizado o download):

3DQEBCwUAA4ICAQByX66p6zg1IuxHd/B7HJ1Whyai0SAS0Mp3kXsQcu36i8uiiFzNQEPtBpwfKisvMyw6rEWHp09D8H7Xw95VRdk2YXkcjAM/Y5IdROWO0/j1P1iQCt+pDPiQt7wqT/9lWE1jjfF/gis1Ohgy8PG+3ChUAuN9gbZdpi83fCzLzCDZRd06GK4qKocLQVav9SOXJpvfUVZqy3WduUDIqaDYDXu/M9E/Gc82CNHK8VyLpCTP+deFjvo8QP9vDLzj+5GcBfI6pb5UQMDjLGfakFZTKfQ3oLGGxWLJkZfhi8etgPu9tQUrfWQrePrV4XXFsFwiGuYhm5vrYW9uROzlNWDxibOEMpjIQeD5sTyeqZzJXUNE9Vx4oi8P0UQFIZeb+I/pQ1rbCde9YVWITsNZOSGLuBK+W42YKx/kKpK45LYSjf7ePVFAkLoUkl3uEfeOfR64YYP/sUc69RPRPL92epWhGjieUnkEZvTudD5Kvf49F30IsXHeU6lw5q5ebjNZgdgLi3U1RfKzvRsU90nctGptL59h9cWnhY17aO68XnK4woZTLOFExLjo5OvYg5GLcvGH/IW4aI5lVhl0qF/JQ7aB+gP0YTuBpTfdg5xyTEaQHOUsv02jXNgVLsH69NOmWwvlQD++0YbcdfxrtKsk8F098kvlIEigZwkcR8vi8nUfYrPtoA==</X509Certificate></X509Data></KeyInfo></Signature></NFe><protNFe versao="3.10"><infProt Id="ID126170016883554"><tpAmb>1</tpAmb><verAplic>NFEPE_P_15.11.05.119</verAplic><chNFe>26170311275007000132550010000100141612886769</chNFe><dhRecbto>2017-03-29T12:35:12-03:00</dhRecbto><nProt>126170016883554</nProt><digVal>QDydiTwofN9TJ+9b12rzbxG4GLI=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo></infProt></protNFe></nfeProc><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
  <HTML DIR='LTR'>
  <HEAD>
   <TITLE>Consulta - Notas Fiscais Sa e Entrada-(Dev.Cli)</TITLE>
   <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
   <META http-equiv="Expires" content="Fri, Jan 01 1900 00:00:00 GMT"/>
   <META http-equiv="Last-Modified" content="Wed, 17 May 2017 14:13:26 GMT"/>
   <META http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate"/>
   <META http-equiv="Cache-Control" content="post-check=0, pre-check=0"/>
   <META http-equiv="Pragma" content="no-cache"/>
   <META http-equiv="refresh" content="900"/>

Obs.:
Este problema ocorre na primeira vez q realizo o download, se eu fizer o download novamente da mesma NF-e, o arquivo vem certinho, sem sujeira alguma de HTML.

Assim, vasculhei tudo quanto é tipo de solução na internet, já estou de cabelo em pé...kkkkkkkkkkkk...O que tiverem de sugestão e ajuda é mto bem vindo.

Desde já agradeço a todos!

jorgepopel

  • Expert
  • *****
  • Mensagens: 625
    • iCentro Tecnologia e Sistemas
    • Email
Re:Rotina para Download de XML da NF-e
« Responder #1 Online: Maio 17, 2017, 02:17:12 pm »
Parceiro,

Eu faço da seguinte forma:
- deixo o xml no disco
- no banco, guardo o endereço do xml, por exemplo "end_xml"
- na grid, crio um campo do tipo imagem_html, por exemplo {xml_file}
- no onrecord coloco:

$_nome_xml = {end_xml};

if (!empty($_nome_xml)) {
   {xml_file} = "<A href='"
      .$_nome_xml
      ."' img src='../_lib/img/nfce_16.png'  target=_blank> XML </A>";
} else {
   {xml_file} = '';
}

------------------------------------
Mas, no teu caso, tente colocar o seguinte MIME no teu array $known_mime_types :
"xml"->"text/xml"

Jorge Popelnitski
www.icentro.com.br/cursos

Cursos de Scriptcase
Desenvolvendo aplicações de maneira rápida com PHP

Curso: Integração de NF-e e Scriptcase

Jailton

  • Expert
  • *****
  • Mensagens: 2450
Re:Rotina para Download de XML da NF-e
« Responder #2 Online: Maio 17, 2017, 02:30:51 pm »
Prefiro guardar o XML na base, ai já deixo alguns dados do XML em campos para consulta, tipo No. NFe, Chave, DataEmitido, CNPJ, IE, NomeEmitente, NomeXML, e o XML,
ai depois crio um controle que Pede exemplo o período de emissão, ele lê o MySQL, grava em uma pasta temporária lê a pasta e já gera um Link do Download do .zip com todos os
XML escolhidos é que tem contador que pede tipo esse serviço:
https://arquivei.com.br/

Bom e tudo isso usando umas 10 linhas de código.
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

tuelito

  • Novato
  • *
  • Mensagens: 10
    • Email
Re:Rotina para Download de XML da NF-e
« Responder #3 Online: Maio 17, 2017, 02:33:11 pm »
Boa tarde Jorge!

Primeiramente obrigado pelo retorno!

Antes o nosso sistema guardava em pastas tb, mas opitimos por armazenar em baco pra não ter perigo de perder e facilitar assim o gerenciamento desses arquivos.

Fiz a alteração conforme me passou, mas o erro ainda continua.

Obrigado!

tuelito

  • Novato
  • *
  • Mensagens: 10
    • Email
Re:Rotina para Download de XML da NF-e
« Responder #4 Online: Maio 17, 2017, 02:37:13 pm »
Boa tarde Jailton!

Exatamente, nosso sistema tb faz dessa maneira.
Tb possuímos um rotina pra gerar XML e DANFE em massa, aí compacta e faz o download normalmente e funciona certinho.

Mas neste caso, gostaria de fazer o download apenas de 1 XML e não queria compactar ele pq o usuário teria o trabalho de descompactar pra depois usar, queria apenas fazer o download dele na extensão de XML mesmo.

Obrigado!

Jailton

  • Expert
  • *****
  • Mensagens: 2450
Re:Rotina para Download de XML da NF-e
« Responder #5 Online: Maio 17, 2017, 02:41:41 pm »
Boa tarde Jailton!

Exatamente, nosso sistema tb faz dessa maneira.
Tb possuímos um rotina pra gerar XML e DANFE em massa, aí compacta e faz o download normalmente e funciona certinho.

Mas neste caso, gostaria de fazer o download apenas de 1 XML e não queria compactar ele pq o usuário teria o trabalho de descompactar pra depois usar, queria apenas fazer o download dele na extensão de XML mesmo.

Obrigado!


Já verificou se o .xml gerado olhando ele você diretamente sem usar a rotina de download esta certo?, tipo copie ele para seu PC e tente abri-lo pelo Browser, dá certo?

Pode ser só a rotina do download que você fez que esta com erro, já notei um erro você esta usando charset=iso-8859-1" />, todos os .xml são UTF-8.
« Última modificação: Maio 17, 2017, 02:43:46 pm por Jailton »
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

tuelito

  • Novato
  • *
  • Mensagens: 10
    • Email
Re:Rotina para Download de XML da NF-e
« Responder #6 Online: Maio 17, 2017, 02:49:31 pm »
Jailto!

Já sim. Como comentei no post, verifiquei o arquivo antes de enviar pra download e está perfeito....depois do download fica essa sujeira de HTML da página.

Sobre o que disse abaixo, o q poderia ser feito pra ajustar isso?

Pode ser só a rotina do download que você fez que esta com erro, já notei um erro você esta usando charset=iso-8859-1" />, todos os .xml são UTF-8.

Obrigado!

Jailton

  • Expert
  • *****
  • Mensagens: 2450
Re:Rotina para Download de XML da NF-e
« Responder #7 Online: Maio 17, 2017, 02:54:28 pm »
Jailto!

Já sim. Como comentei no post, verifiquei o arquivo antes de enviar pra download e está perfeito....depois do download fica essa sujeira de HTML da página.

Sobre o que disse abaixo, o q poderia ser feito pra ajustar isso?

Pode ser só a rotina do download que você fez que esta com erro, já notei um erro você esta usando charset=iso-8859-1" />, todos os .xml são UTF-8.

Obrigado!

Esse código que você usou parece que quem fez ele queria fazer um programa em c++ e não um link apenas para download, hehee, use html5, que vai dar certo.
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

tuelito

  • Novato
  • *
  • Mensagens: 10
    • Email
Re:Rotina para Download de XML da NF-e
« Responder #8 Online: Maio 17, 2017, 03:07:21 pm »
Creio que não Jailton, pq o código é super simples.
Quem fez foi Haroldo aqui do fórum.

Mas o código simplesmente identifica a extensão do arquivo, monta as header's e faz download.

Agora sobre usar HTML5 como vc, não entendi como fazer. Vc tem algum exemplo pra me enviar?

Obrigado!