Ir para conteúdo
Fórum Script Brasil
  • 0

A pasta


Frank K Hosaka

Pergunta

Ontem, eu baixei um arquivo zipado da Bling com todas as notas de junho, só que o ZipArchive do PHP não conseguiu abrir. Usando var_dump($_FILES['arquivo']) encontrei uma chave error com int 1. Mandei o arquivo para a Bling, pedindo socorro.

Apesar do ZipArchive não poder trabalhar com um arquivo corrompido, eu vi que o Windows é capaz de extrair o arquivo. E o PHP é capaz de olhar todos os arquivos da nova pasta que foi extraída com o comando scandir. 

O problema é como pegar o nome da pasta.

A Gemini disse que o JavaScript não é capaz de obter o nome da pasta que você quer selecionar, mas ela sugeriu usar <input type=file> para selecionar um arquivo dentro da pasta, e depois obter o nome da pasta. Para fazer esse tipo de gambiarra, o PHP é tão bom quanto o JavaScript.

Eu vi que o Windows cria a pasta com o mesmo nome do arquivo zipado, logo o nome da pasta é C:/Users/frank/Downloads/pasta, onde pasta é igual ao nome do arquivo zipado sem a extensão zip:

Arquivo notaFaltante.php:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<form method=post class="w-50 m-auto" enctype="multipart/form-data">
    <h5>Nota Faltante</h5>
    <label for=arquivo>Escolha o arquivo Zipado</label>
    <input type=file name=arquivo>
    <input type=submit>
</form>

<?php

if(isset($_GET['pasta']))
{
    $diretorio=$_GET['pasta'];
    $contaArquivos = count(scandir($diretorio)) - 2;
    $notasFiscais = [];
    $nfces = scandir($diretorio);
    $somaTotal=0;
    foreach($nfces as $nfce)
    {
        if($nfce !== '.' && $nfce !=='..' )
        {
            $notasFiscais[]=intval(substr($nfce,28,6));
            $dom = new DOMDocument();
            $dom->load("$diretorio/$nfce");
            $nfe=$dom->documentElement;
            $somaTotal+=$nfe->getElementsByTagName('vNF')->item(0)->textContent;
        }
    }
    goto Continua;
}

if(!isset($_FILES['arquivo']))
{
    exit;
}

if($_FILES['arquivo']['error'])
{
    $pasta="C:/Users/frank/Downloads/" . substr($_FILES['arquivo']['name'],0,-4);
    ?>  <form class="w-50 m-auto">
            <p></p>
            <p>Arquivo corrompido, tente extrair pelo Windows</p>
            <p>Se der certo, volte aqui e pressione [Continuar]</p>
            <input type=hidden name=pasta value=<?=$pasta?>>
            <input type=submit value=Continuar>
        </form>
    <?php exit;
}

$zip=new ZipArchive();
$zip->open($_FILES['arquivo']['tmp_name']);
$contaArquivos = $zip->count();
$notasFiscais = [];
$somaTotal = 0;
for($i=0;$i<$contaArquivos;$i++)
{
    $nfce=$zip->getFromIndex($i);
    $dom=new DOMDocument();
    $dom->loadXML($nfce);
    $nfe=$dom->documentElement;
    $notasFiscais[]=$nfe->getElementsByTagName('nNF')->item(0)->textContent;
    $somaTotal+=$nfe->getElementsByTagName('vNF')->item(0)->textContent;

}
Continua:
sort($notasFiscais);
$primeiraNota=intval($notasFiscais[0]);
$ultimaNota=intval($notasFiscais[$contaArquivos-1]); ?>
<table class="table table-striped w-50 m-auto">
    <tr><td>Número de arquivos xml<td class=text-end><?=$contaArquivos?>
    <tr><td>Total das Notas Fiscais<td class=text-end><?=number_format($somaTotal,2,',','.')?>
    <tr><td>Primeira Nota<td class=text-end><?=$primeiraNota?>
    <tr><td>Última Nota<td class=text-end><?=$ultimaNota?>
    <tr><td>Notas Faltantes<td class=text-end><?=$ultimaNota-$primeiraNota+1-$contaArquivos?>
    <?php
    for($i=$primeiraNota;$i<=$ultimaNota;$i++)
    {
        if(!in_array($i,$notasFiscais))
        {
        ?> <tr><td><?=$i?> <?php
        }
    }
    ?>
</table>

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...