PHP's ZipArchive function does not work with more than one file

2

The code is as follows:

$zip = new ZipArchive();
$criou = $zip->open("download.zip", ZipArchive::CREATE);
if ($criou === true){

    $diretorio = UPLOAD_DIR . 'produto/small/';

    foreach ($imagens as $imagem) {
        $zip->addFile($diretorio . $imagem->arquivo . '.' . $imagem->extensao, $imagem->arquivo . '.' . $imagem->extensao);
        echo $diretorio . $imagem->arquivo . '.' . $imagem->extensao;
        echo '<br />';
    }

    $zip->close();

}else {
    echo 'Erro: '.$criou;
}

The result of echo within foreach is displayed perfectly, without errors, as follows:

/site/public/uploads/produto/small/BN-260-A.jpg
/site/public/uploads/produto/small/BN-260-B.jpg
/site/public/uploads/produto/small/BN-261.jpg
/site/public/uploads/produto/small/BN-373.png
/site/public/uploads/produto/small/BN-10125-A.jpg

However, the downloaded file generates a loop with a file.

    
asked by anonymous 17.09.2014 / 21:21

1 answer

4

Important to verify that the file is actually being written in full when closing:

if ( $zip->close() ) {
   echo 'Arquivo fechado com sucesso';
} else {
   echo 'Problemas no fechamento';
}

Another relevant step is to make sure the file exists and is readable:

foreach ($imagens as $imagem) {
   $caminho_relativo = $imagem->arquivo.'.'.$imagem->extensao;
   $caminho_absoluto = $diretorio.$caminho_relativo;
   if ( file_exists( $caminho_absoluto ) && is_readable( $caminho_absoluto ) ) {
      $zip->addFile( $caminho_absoluto, $caminho_relativo );
      echo $caminho_absoluto.' adicionado<br />';
   else {
      echo $caminho_absoluto.' com problemas<br />';
   }
}
    
17.09.2014 / 21:27