Bonjour a tous,

Je souhaite apres avoir créer des fichiers xml en php (Merci de l'aide de Soundboy39) les mettre dans une archive avec l'extension .cab.
Si quelqu'un connais ça m'interesse.

Sinon j'ai trouver "MakeCAB" sur phpclasses.org une class qui fais ça mais le souci c'est qui'il date de plus de 10 ans donc obsolete.
Mais si quelqu'un a le courage de m'aider a le mettre a jour, ça serait cool.

Elle fonctionne pas correctement car elle me genere bien une archive .cab mais les fichier sont endomagé.
Voici les erreur qu'il me genere:

1 Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; MakeCAB has a deprecated constructor in C:\wamp64\www\TsvStageMakerResponsive\lib\makecab\MakeCAB.class.php on line 13:

         class MakeCAB{ (line 13 ici)

2 Warning: stat(): stat failed for WinMSS/* in C:\wamp64\www\TsvStageMakerResponsive\lib\makecab\MakeCAB.class.php on line 126:

  function addfile($file,$strip=true,$atribs=32){
    $filename = $strip==false ? $this->MakeWinPath( $file ) : $this->StripPath($file,$strip);
      $m=stat($file); (line 126 ici)
      $newcabfile = array('ucomp' => $m['size'],
                          'offset' => $this->cabfolder['fileoffset'],
                          'date' => $this->MakeCabFileDate($m['mtime']),
                          'time' => $this->MakeCabFileTime($m['mtime']),
                          'atribs' => $atribs,
                          'name' => $this->MakeWinPath($filename)."\0",
                          'path' => $file,
                          'size' => $m['size'] );
    $this->cabfolder['fileoffset'] += $m['size'];
    $this->cabfolder['offset'] += 17 + strlen( $filename );

    $this->cabheader['size'] += 17 + strlen( $filename ) + $m['size'];
    $this->cabheader['numfiles']++;
    $this->cabfiles[]=$newcabfile;
    clearstatcache();
  }

3 Notice: Undefined index: index in C:\wamp64\www\TsvStageMakerResponsive\lib\makecab\MakeCAB.class.php on line 314:
4 Notice: Undefined index: fileattr in C:\wamp64\www\TsvStageMakerResponsive\lib\makecab\MakeCAB.class.php on line 317

  function WriteFiles($res){
    foreach ( $this->cabfiles as  $file )
    {
        $this->WriteDword( $res, $file['ucomp'] );
        $this->WriteDword( $res, $file['offset'] );
        $this->WriteWord( $res, $file['index'] ); (line 314 ici)
        $this->WriteWord( $res, $file['date'] );
        $this->WriteWord( $res, $file['time'] );
        $this->WriteWord( $res, $file['fileattr'] ); (line 317 ici)
        $this->WriteByteBuffer( $res, $file['name'] );
    }
  }

5 Notice: Array to string conversion in C:\wamp64\www\TsvStageMakerResponsive\lib\makecab\MakeCAB.class.php on line 368

   function WriteData($res){

    $datasize = $this->cabfolder['fileoffset'];
    $blocksize = $datasize > $this->BLOCKSIZE ? $this->BLOCKSIZE : $datasize;
    $block = $blocksize;
    $newblock = false;

    foreach ( $this->cabfiles as $file ){
      if(false !== ($res1 = @fopen( $file['path'], "rb" ))){

        $read_this_time = 0;
        $read_last_time = 0;
        while(!feof($res1)){
          $buffer .= fread($res1,$block);
          $read = ftell($res1);
          $read_this_time = $read - $read_last_time;
          $read_last_time = $read;
          $datasize -= $read_this_time;

          if($read_this_time == $blocksize){
            $block = $this->BLOCKSIZE;
            $newblock = true;
          } else {
            $block -= $read_this_time;
            $newblock = false;
             if($block <= 0){
               $block = $this->BLOCKSIZE;
               $newblock = true;
             }
          }

          if( $newblock ){
            $data = $this->cabfolder['typecmp'] == 1 ? $this->compressdata($buffer) : array('cbytes'=>$blocksize,'data'=>$buffer);
            $this->WriteDword( $res, 0 );
            $this->WriteWord( $res, $data['cbytes'] );
            $this->WriteWord( $res, $blocksize );
            $this->WriteByteBuffer( $res, $data['data'] );
            $blocksize = $datasize > $this->BLOCKSIZE ? $this->BLOCKSIZE : $datasize;
            $buffer = "";
          }

        }
        ## close input file
        fclose( $res1 );
        if(preg_match("'\.cabtemp$'",$file['path'])) unlink($file['path']);
      } else {
        die("Failed to open ".$file); (line 368 ici)
      }

    }

  }

Je sais que c'est pas simple comme ça mais voici le lien vers la les fichiers class au cas ou il y aurait volontaire.
Je sais pas si je suis autorisé a mettre des liens comma ça, désolé si ce n'est pas le cas!
https://www.phpclasses.org/package/4056-PHP-Create-CAB-archives-from-lists-of-files.html

8 réponses


Nesyou75
Auteur

Hello Balsakup,
Merci pour le lien mais apparemment il ne créé pas d'archive en .cab.
Lecture et extraction
https://packagist.org/packages/wapmorgan/cab-archive

Nesyou75
Auteur

Hello,
J'ai modifier le nom du constructeur de "function MakeCAB" a "function __construct".

ça semble fonctionner mieux, mais j'ai un souci a l'utilisation:
dans l'exemple il donne:
//add all of the contents of a local file system directory, leaving the base directory
j'ai tester de mettre le nom du dossier:
$cab->adddir("C:\wamp64\www\TsvStageMakerResponsive\WinMSS");
ça fonctionne mais mais les fichiers sont encore endomagés

Par contre quand j'utilise la fonction $cab->addfile avec un seul fichier le fichier est correct
Je ne sais pas quelle syntax utiliser pour lui dire de mettre tout les fichiers dans l'archive?
J'ai essayé :
$cab->addfile("WinMSS/STAGE.xml","THEMATCH.xml", "CLASSIFY.xml", "CLUB.xml", "ENROLLED.xml", "MEMBER.xml", "SCORE.xml", "SQUAD.xml", "TAG.xml", "TEAM.xml");
et
$cab->addfile("WinMSS/STAGE.xml,'THEMATCH.xml', 'CLASSIFY.xml', 'CLUB.xml', 'ENROLLED.xml', 'MEMBER.xml', 'SCORE.xml', 'SQUAD.xml', 'TAG.xml', 'TEAM.xml'");

et
$cab->addfile("WinMSS/STAGE.xml,THEMATCH.xml, CLASSIFY.xml, CLUB.xml, ENROLLED.xml, MEMBER.xml, SCORE.xml, SQUAD.xml, TAG.xml, TEAM.xml");

mais ça fonctionne pas.
SI quelqu'un a une idée svp?

Nesyou75
Auteur

La fonction addfile est la suivante:

 * Method: addfile
 *   Add a local file system file to your cab file
 * @param string $file - path preferably absolute path
 * @param bool|string $strip  - if string is used parser will leave on the path what it is told to 
 *                                e.g.: $file="/usr/path/data/file" $strip="/path" will result in an archive entry="/path/data/file"
 *                              a strip value of (bool) false then would result in archive entry= "/usr/path/data/file"
 * @param int $atribs - e.g hidden, read-only  - see sdk
 */  
  function addfile($file,$strip=true,$atribs=32){
    $filename = $strip==false ? $this->MakeWinPath( $file ) : $this->StripPath($file,$strip);
      $m=stat($file);
      $newcabfile = array('ucomp' => $m['size'],
                          'offset' => $this->cabfolder['fileoffset'],
                          'date' => $this->MakeCabFileDate($m['mtime']),
                          'time' => $this->MakeCabFileTime($m['mtime']),
                          'atribs' => $atribs,
                          'name' => $this->MakeWinPath($filename)."\0",
                          'path' => $file,
                          'size' => $m['size'] );
    $this->cabfolder['fileoffset'] += $m['size'];
    $this->cabfolder['offset'] += 17 + strlen( $filename );

    $this->cabheader['size'] += 17 + strlen( $filename ) + $m['size'];
    $this->cabheader['numfiles']++;
    $this->cabfiles[]=$newcabfile;
    clearstatcache();
  }

Hello,

La function "addfile" ne permet pas de prendre plusieurs fichiers apparement, ni même de tableau.

A la limite essaye de passer par un boucle du style :

$xml_files = array("WinMSS/STAGE.xml","THEMATCH.xml", "CLASSIFY.xml", "CLUB.xml", "ENROLLED.xml", "MEMBER.xml", "SCORE.xml", "SQUAD.xml", "TAG.xml", "TEAM.xml");
foreach($xml_files as $xml){
    $cab->addfile($xml);
}
Nesyou75
Auteur

Hello Blinkers,
Bonne idée mais ça fonctionne pas il me genere plein d'erreur toutes variables sont undefined.

Nesyou75
Auteur

Apres de multiple test je me appercu que il y a toujours un fichier qui n'est pas entirement créer ce qui rend le .cab dans un état endomagé.
Par contre j'ai trouvé une maniere de faire pas tres belle mais elle fonctionne mais pareil un fichier est toujours tronqué:
la voici, lorsque je commente une ligne ça fonctionne correctement alors que si je mets tout les fichiers non!!

//Send the MSCAB MIME type
header("Content-Type: application/vnd.ms-cab-compressed");
//Make it an attachment
header('Content-Disposition: attachment; filename="WinMSS.cab"');
//include the class file
include 'lib/makecab/MakeCAB.class.php';
//create object
$cab = new MakeCAB("WinMSS.cab");
//add a local file system file
$cab->addfile("WinMSS/STAGE.xml");
$cab->addfile("WinMSS/THEMATCH.xml");
$cab->addfile("WinMSS/CLASSIFY.xml");
$cab->addfile("WinMSS/CLUB.xml");
$cab->addfile("WinMSS/ENROLLED.xml");
$cab->addfile("WinMSS/MEMBER.xml");
// $cab->addfile("WinMSS/SCORE.xml");
$cab->addfile("WinMSS/SQUAD.xml");
$cab->addfile("WinMSS/TAG.xml");
$cab->addfile("WinMSS/TEAM.xml");

//Make the file
$cab->WriteCAB();
//output the file
readfile("WinMSS.cab");
//delete the file
unlink("WinMSS.cab");  
}
?>
Nesyou75
Auteur

Hello,
il me reste les 2 erreurs Undefined index et filettr mais je ne sais pas comment les définir, je ne sais pas si cest la cause du problème, qui est que la génération du .cab fonctionne mais il y a peut-être une limite de taille poids ou autre car il me tronque toujours un fichier.