Rotina para Download de XML da NF-e

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:

[ul][li]Evento onRecord:
[list]
[li]
$var_lnkXML = ‘index.php?lnkXML=’.{chave_acesso};
{lnkXML} = “XML”;
[/li]
[/list]
[/li][/ul]

[br]

[ul][li]onScriptInit:
[list]
[li]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.[/li]
[/list]
[/li][/ul]

[br]

[ul][li]Programação -> Métodos PHP -> função output_file:[/li][list]
[li]
$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.”);
}
[/li]
[/list][/ul]

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==1NFEPE_P_15.11.05.119261703112750070001325500100001001416128867692017-03-29T12:35:12-03:00126170016883554QDydiTwofN9TJ+9b12rzbxG4GLI=100Autorizado o uso da NF-e

Consulta - Notas Fiscais Sa e Entrada-(Dev.Cli)

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!

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} = " XML ";
} else {
{xml_file} = ‘’;
}


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

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.

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!

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.

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?

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.

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!