Confirmation de bug :(

Help
2009-03-27
2013-04-26
  • POULAIN Nicolas

    POULAIN Nicolas - 2009-03-27

    Bonjour
    Sous mandriva 2008, même souci à l'ouverture du fichier généré.

    J'arrive à dézipper l'archive. et en la rezippant on peut lire le fichier.

    L'analyse de l'archive donne ça :
    [nico@localhost bricolage]$ zip -T checkresult.odt
            zip warning: local and central headers differ for (null)
            zip warning:  offset 2--local = 00, central = 08
    zip error: Zip file structure invalid (checkresult.odt)

    Ma config (php info) :
    Zip     enabled
    Extension Version     $Id: php_zip.c,v 1.95.2.6 2007/05/19 22:35:49 pajoye Exp $
    Zip version     1.8.10
    Libzip version     0.7.1

    Nico

     
    • POULAIN Nicolas

      POULAIN Nicolas - 2009-03-27

      Embêtant quand même :((

      ça donne quelque chose si on reconstruit l'archive de ce genre (pas tout fait, juste pour test) :

      // On exporte le fichier
      //$odf->exportAsAttachedFile();
      $odf->saveToDisk('./test.odt') ;

      $za = new ZipArchive();
      $za->open('test.odt');
      $za->extractTo('./test_ouvre') ;
      $za->close();

      $filename = 'test_2.odt' ;
      $zb = new ZipArchive();
      if ($zb->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
          exit("Impossible d'ouvrir <$filename>\n");
      }
      $zb->addFile('test_ouvre/content.xml','content.xml') ;
      $zb->addFile('test_ouvre/meta.xml','meta.xml') ;
      $zb->addFile('test_ouvre/mimetype','mimetype') ;
      $zb->addFile('test_ouvre/settings.xml','settings.xml') ;
      $zb->addFile('test_ouvre/styles.xml','styles.xml') ;
      $zb->close();

      Donc toujours possible de faire une function reconstruit_zip() éventuellement :\

      D'autres manières de contourner éventuellement ?

      Merci pour le script en tout cas :D
      Nico

       
    • obook

      obook - 2009-03-28

      Oui c'est confirmé par l'auteur de php-zip

      Si vous ne pouvez pas attendre la prochaine version, voici comment faire :

      Dans un nouveau dossier par exemple ~/DEV/PHP/, récupérer la version courante de zip PHP ,  il faut avoir CVS d'installé :

      cvs -d :pserver:cvsread@cvs.php.net:/repository login , utiliser le login phpfi
      cvs -d :pserver:cvsread@cvs.php.net:/repository checkout -r PHP_5_2 php5/ext/zip

      installer par urpmi php-devel 5.2.6-18.4mdv2009.0 ( 5.2.6-18.4 étant ma version de PHP )

      copier le dossier zip de ~/DEV/PHP/php5/ext dans /usr/src/php-devel/ext
      puis modifier le code /usr/src/php-devel/ext/zip/lib/zip_close.c, ligne 198

      #if 0
      if (de.bitflags & ZIP_GPBF_DATA_DESCRIPTOR) {
           de.crc = za->cdir->entry[i].crc;
           de.comp_size = za->cdir->entry[i].comp_size;
           de.uncomp_size = za->cdir->entry[i].uncomp_size;
           de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR;
      }
      #endif

      Lancer la compilation par :

      phpize
      ./configure
      make

      on doit trouver /usr/src/php-devel/ext/zip/modules/zip.so
      a placer dans /usr/lib/php/extensions/zip.so

      Redémarrer apache, httpd -k restart

      Olivier.

       
    • POULAIN Nicolas

      POULAIN Nicolas - 2009-03-28

      ça marche avec ce qui suit... étonnant :\

      // On exporte le fichier
      $odf->saveToDisk('./test.odt') ;
      repare_zip('test.odt') ;

      function reconstruit_zip($dir,&$zb,$suppr_length) {
          if ($handle = opendir($dir)) {
              while (false !== ($file = readdir($handle))) {
              if ($file != "." && $file != "..") {
                  if ( is_dir("$dir/$file") ) {
                      $t = substr("$dir/$file",$suppr_length) ;
                      echo "Cree : $t<br/>" ;
                      $zb->addEmptyDir($t) ;
                      reconstruit_zip("$dir/$file",$zb,$suppr_length) ;
                  }
                      else {
                          $t = substr("$dir/$file",$suppr_length) ;
                          echo "$dir/$file -> $t<br/>";
                          $zb->addFile("$dir/$file",$t) ;
                      }
              }
              }
              closedir($handle);
          }
      }
      function repare_zip($file) {
          // dossier d'extraction temporarie
          $dir_temp = './temp' ;
          // decompacte l'archive
          $za = new ZipArchive();
          $za->open($file) ;
          $za->extractTo($dir_temp) ;
          $za->close();
          // renomme
          rename($file,$file."_bad") ;
          $zb = new ZipArchive();
          if ($zb->open($file, ZIPARCHIVE::CREATE)!==TRUE) {
              exit("Impossible d'ouvrir <$file>\n");
          }
          // caractères à supprimer
          $suppr_length = strlen($dir_temp) + 1 ;
          reconstruit_zip($dir_temp,$zb,$suppr_length) ;
          $zb->close() ;
          // efface le dossier
          rmdir_recurse($dir_temp) ;
      }
      function rmdir_recurse($path) {
          $path= rtrim($path, '/').'/';
          $handle = opendir($path);
          for (;false !== ($file = readdir($handle));)
              if($file != "." and $file != ".." ) {
                  $fullpath= $path.$file;
                  if( is_dir($fullpath) ) {
                      rmdir_recurse($fullpath);
                  } else {
                      //unlink($fullpath);
                      echo "efface $fullpath<br/>" ;
                  }
          }
          closedir($handle);
          //rmdir($path);
          echo "efface $path<br/>" ;
      }

       

Log in to post a comment.

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:

JavaScript is required for this form.





No, thanks