8796 sujets

Développement web côté serveur, CMS

Salut à tous !

Je vous écrit car je coince vraiment sur un module que je suis en train de créer.
Ce module me sert à uploader sur mon serveur, des archive en .zip et a pour rôle de les décompresser dans un fichier "themes". J'ai donc fais des recherches et j'ai réussi à créer ce script :



$zip = new ZipArchive();

if ($zip->open('Affection.zip') != TRUE) {
    die ("Impossible d'ouvrir l'archive");
}

$zip->extractTo('themes/');
$zip->close();

echo "Archive extraite avec succès";



Logiquement cela devrait fonctionner, néanmoins, j'ai deux erreurs :

Warning: ZipArchive::extractTo() [ziparchive.extractto]: Invalid or unitialized Zip object in C:\Program Files\Wamp\www\Travaux\Modules\RarUpload\index.php on line 11

Warning: ZipArchive::close() [ziparchive.close]: Invalid or unitialized Zip object in C:\Program Files\Wamp\www\Travaux\Modules\RarUpload\index.php on line 15
Archive extracted to directory

Si vous pouviez m'aider, j'ai vu pas mal de sujets avec le même problème, mais aucune solution Smiley sweatdrop .

Merci par avance Smiley cligne .
Modifié par DevAddict (03 Sep 2009 - 10:25)
Salut,

edit : [s]Il ne faut pas de parenthèses à "new ZipArchive".[/s] Je viens de voir le lien d'Heyoan et dans les codes ils utilisent bien les parenthèses alors que dans la doc (php.net) pas du tout...

Si ça ne fonctionne toujours pas essaie le premier exemple qui est donné sur php.net
http://us2.php.net/manual/en/function.ziparchive-extractto.php
Modifié par kurt11 (03 Sep 2009 - 12:08)
kurt11 a écrit :
Il ne faut pas de parenthèses à "new ZipArchive".
A priori ça ne changera rien. Smiley cligne
Les parenthèses ne changes rien en effet. J'ai testé le premier exemple de php.net et j'ai toujours l'erreur. Une chose étrange par contre, dans leur script ils mettent :

if($zip->open('file.zip') === TRUE)


Je trouve bisard le triple égal === .
D'ailleurs ça retourne une erreur, donc j'ai bien modifié en mettant simplement le double égal ==.

Merci pour le liens du tutoriel, j'ai bien tout vérifié, le .dll est installé convenablement, je ne vois vraiment pas d'où vient l'erreur...

Y aurait-il un autre moyen pour décompresser une archive dans un dossier lors de son upload ?
Je viens de trouver ceci

a écrit :

Now, with php 5.2.8, it does not work and gives this warning:

Warning: ZipArchive::addFromString() [ziparchive.addfromstring]: Invalid or unitialized Zip object in Smiley myfile on line Smiley myline

To fix this, you must specify the flags as create or overwrite.


Si tu utilises la version 5.2.8 ou plus de php, essaie en ajoutant "ZIPARCHIVE::OVERWRITE" par exemple à open()
Ça donne
$zip->open( $zipFileName, ZIPARCHIVE::OVERWRITE );


edit : Concernant le ===, cela veut dire strictement égal. Dans ce cas, on contrôle que $zip->open() retourne bien un booléen de valeur true et non un string de valeur true ou un int de valeur 1...
Modifié par kurt11 (03 Sep 2009 - 12:57)

$zip = new ZipArchive(); 
 
if ($zip->open('Affection.zip', ZIPARCHIVE::OVERWRITE) !== TRUE) { 
    die ("Impossible d'ouvrir l'archive"); 
} 
 
$zip->extractTo('themes/'); 
$zip->close(ZIPARCHIVE::OVERWRITE); 
 
echo "Archive extraite avec succès";


Ça ne fonctionne toujours pas, par contre je n'ai plus les erreurs Smiley smile .
Le mode d'ouverture n'est pas obligatoire ? Il me semblais que si...
En tout cas n'utilise pas OVERWRITE.... ça t'écrase le contenu de l'archive et d'après ton code ce n'est pas ce que tu veux.
Je veux juste pourvoir récupérer l'archive .zip que j'upload via mon formulaire, et ensuite l'extraire dans le dossier "themes". Tu saurais m'aider Quentin ?
A vue de nez, je dirais que le problème vient du chemin passé à la méthode extractTo().
Elle doit prendre un chemin physique en paramètre.
Il faudrait tenter quelque chose du genre

$path = realpath("/themes")."/";
if ($zip->extractTo($path)!== TRUE)
{
  die ("Impossible d'extraire l'archive");
}
echo "Archive extraite avec succès"; 


Et bien vérifier les droits en écriture sur le dossier themes en question.
Bon, je viens de faire une petite page de test rapidement pour voir ce qui clochait et elle fonctionne nickel. Je te la poste ici.
Si elle ne fonctionne pas chez toi il y a plusieurs pistes a explorer :
- version de l'algo zip utilisé
- droits (sur le zip après upload et sur le répertoire cible)
J'espère que ce te sera utile.


function zip_process(){
  $folder = realpath(".");
  if(move_uploaded_file($_FILES['zip']['tmp_name'], $folder."/". $_FILES['zip']['name']))
  {
    return true;
  }
  else
  { //sinon on retourne faux
    return false;
  }
}
if(isset($_POST['sended'])){
  $zipname = $_FILES['zip']['name'];
  if(zip_process()){
    $zip = new ZipArchive();
    if ($zip->open($zipname, ZIPARCHIVE::OVERWRITE) !== TRUE) {  
      die ("Impossible d'ouvrir l'archive");  
    }  
  
    $zip->extractTo(realpath("./test/")."/");  //créer un repertoire "test" a la racine du site [cligne]
    $zip->close();  
  
    echo "Archive extraite avec succès"; 
  
  }  
}


avec le html :


<html>
<head>
  <title>Test unzip</title>
</head>
  <body>
    <form id="upform" action="index.php" enctype="multipart/form-data" method="post">
      <input type="hidden" name="sended" value="1" />
      <input type="file" name="zip" />
      <input type="submit" value="send" />
    </form>
  </body>
<html>

Modifié par ltkocz (04 Sep 2009 - 13:34)
Merci c'est vraiment sympa d'avoir prit le temps de me faire un script. Néanmoins, ça ne fonctionne pas... Et pourquoi ? Bonne question... Je vais abandonner cette idée pour le moment et j'uploaderai à la main, après tout pour un ou deux thème par mois...

Merci à tous d'avoir tenté de m'aider Smiley smile
Alors là, je cale. Un série de questions :

- Comme tu travailles sous wamp, as tu bien coché le module zip (click sur l'icone wamp, PHP > PHP Extensions>php_zip) ?

-As tu copié ton zip dans un répertoire spécifique lors de l'upload ? Si oui, le chemin que tu passes à la méthode open est il le bon?

- As tu tenté une gestion d'exception pour avoir un retour sur ce qui cloche :
try {
"ton code d'extraction
} catch (Exception $e) {
echo 'Exception: ' . $e->getMessage();
}

- as tu utilisé ZipArchive::getStatusString pour voir ce qui pouvait clocher?

Autant de pistes a explorer.
Modifié par ltkocz (04 Sep 2009 - 16:21)
Bonsoir à toutes et à tous,

Je viens d'avoir le même soucis.
Mais je pense en avoir trouvé la cause : le fichier est corrompu lorsque j'essaie de l'ouvrir avec winrar.

Mais dans ce cas, il génère une erreur PHP.
Y a t il moyen d'intercepter ce genre d'erreur ?

Merci. Smiley cligne