Hello la compagnie :)!

J'ai un gros problème...
J'utilise la fonction d'archivage zip (ZipArchivage)
sur mon serveur local tout marche nickel chrome !
Mais sur mon hébergeur rien ne va plus ...
Avant toute chose, le dossier de destination est en 2777.

Voici le code:

$zip= new ZipArchive();
        $zip->open('files/temp/'.$destination.'.zip',ZipArchive::CREATE);
        foreach($fichier as $dirfichier => $fichier){
            if($dirfichier==='CV'){ $zip->addFile($dir.DS.'cv'.DS.$fichier,'Dossier/CV/'.$fichier);
            }else{ 
            $zip->addFile($dir.DS.'Doc'.DS.$fichier,'Dossier/Document(s) annexe(s)/'.$fichier);
            }
        }

        $zip->close();

Jusqu'ici aucun soucis MAIS voila ce que j'ai quand je fais un "debug" juste après le $zip->close :

ZipArchive Object
(
    [status] => 5
    [statusSys] => 2
    [numFiles] => 2
    [filename] => 
    [comment] => 
)

donc d'après moi je pense que c'est le close qui foire...
Mais pourquoi ? quelqu'un a une idée ?

14 réponses


StarTechs
Réponse acceptée

Salut ! Ton code me semble bon et les permissions aussi (faut que le denrier chiffre soit un 7 pour que PHP puisse écrire sur le serveur). À tout hasard, je te sort une classe qui est tirée des commentaires de la doc officielle de PHP ZipArchive :

<?php 
class HZip 
{ 
  /** 
   * Add files and sub-directories in a folder to zip file. 
   * @param string $folder 
   * @param ZipArchive $zipFile 
   * @param int $exclusiveLength Number of text to be exclusived from the file path. 
   */ 
  private static function folderToZip($folder, &$zipFile, $exclusiveLength) { 
    $handle = opendir($folder); 
    while (false !== $f = readdir($handle)) { 
      if ($f != '.' && $f != '..') { 
        $filePath = "$folder/$f"; 
        // Remove prefix from file path before add to zip. 
        $localPath = substr($filePath, $exclusiveLength); 
        if (is_file($filePath)) { 
          $zipFile->addFile($filePath, $localPath); 
        } elseif (is_dir($filePath)) { 
          // Add sub-directory. 
          $zipFile->addEmptyDir($localPath); 
          self::folderToZip($filePath, $zipFile, $exclusiveLength); 
        } 
      } 
    } 
    closedir($handle); 
  } 

  /** 
   * Zip a folder (include itself). 
   * Usage: 
   *   HZip::zipDir('/path/to/sourceDir', '/path/to/out.zip'); 
   * 
   * @param string $sourcePath Path of directory to be zip. 
   * @param string $outZipPath Path of output zip file. 
   */ 
  public static function zipDir($sourcePath, $outZipPath) 
  { 
    $pathInfo = pathInfo($sourcePath); 
    $parentPath = $pathInfo['dirname']; 
    $dirName = $pathInfo['basename']; 

    $z = new ZipArchive(); 
    $z->open($outZipPath, ZIPARCHIVE::CREATE); 
    $z->addEmptyDir($dirName); 
    self::folderToZip($sourcePath, $z, strlen("$parentPath/")); 
    $z->close(); 
  } 
} 
?>

tu peux tenter de l'utiliser voir si ça marche. Si ça ne marche pas cela vient sûrement d'un problème de configuration côté serveur, c'est uniquement pour savoir d'où vient le problème que je te propose ça.

EDIT : si ça marche en local, le problème me semble orienté vers la configuration du serveur. Tu peux nous sortir un phpinfo() ?

Que donne un getStatusString ?

HoustonB
Auteur

Pour le Php info :

Zip enabled
Extension Version $Id: php_zip.c 284448 2009-07-20 15:26:54Z pajoye $
Zip version 1.9.1
Libzip version 0.9.0

Pour GetStatusString :

Read error: No such file or directory

le pb doit venir des chemins des fichiers source
affiche ce que vaut :
$dir.DS.'cv'.DS.$fichier
$dir.DS.'Doc'.DS.$fichier
vérifie les minuscules/majuscules

HoustonB
Auteur

/home/www/b0dfda55decfc9dXXXXXXXXXX28e126/web/webroot/files/candidats/XXXXXXXX-mélanie vera-2015-04-22/cv/XXXXXXX Mélanie CV FR-self.pdf

/home/www/b0dfda55decfc9dXXXXXXXXX528e126/web/webroot/files/candidats/XXXXXXXX-mélanie vera-2015-04-22/Doc/XXXXXX Mélanie CV EN-self.pdf

L'envoie de fichiers sur un serveur c'est généralement galère à cause de la gestion des routes et des permissions sur les dossiers & fichiers. Commence par ici déjà ;)
De plus, le "Read error: No such file or directory" en dit long c'est un soucis de route visiblement.

HoustonB
Auteur

Pourtant j'ai essayer toute les routes possible :( le lien en haut fonctionne si je le met dans le navigateur ( en remplaçant le code par l'url du site ) j'arrive bien a ouvrir le fichier pdf :/

Pour lever le doute, force le nom de fichier par un nom simple qui existe (pas d'accents et les droits en lecture pour other).
J'ai déja eu des pb d'encodage lié à des accents

HoustonB
Auteur

Non rien de nouveau, j'ai en droit 2777 sur tout les dossier ( recupération de fichier et création du zip)

Es-tu sûr que ce n'est pas la configuration du serveur distant qui bloquerait ?

HoustonB
Auteur

Je pense mais comment le savoir ? :/

Bonne question. Tu devrais ouvrir un accès FTP via PHP et voir ce qu'il te retourne.

HoustonB
Auteur

Oula je ne sais pas comment faire , mais j'ai trouver une solution alternative a mon problème merci quand même pour vos réponse !

Tu as fait comment du coup ?