7
votes

Meilleure façon de lire le fichier zip dans php

file_get_contents ("Zip: //a/b/c.zip") renvoie null . Comment puis-je lire des contenus décompressés d'un fichier zip dans PHP 5 +?


0 commentaires

5 Réponses :


5
votes

Utiliser zip_open code> et zip_read code> fonctionne pour le faire. Documentation Vous pouvez trouver chez http://php.net/manual/fen /function.zip-read.php

<?php
/**
* This method unzips a directory within a zip-archive
*
* @author Florian 'x!sign.dll' Wolf
* @license LGPL v2 or later
* @link http://www.xsigndll.de
* @link http://www.clansuite.com
*/

function extractZip( $zipFile = '', $dirFromZip = '' )
{   
    define(DIRECTORY_SEPARATOR, '/');

    $zipDir = getcwd() . DIRECTORY_SEPARATOR;
    $zip = zip_open($zipDir.$zipFile);

    if ($zip)
    {
        while ($zip_entry = zip_read($zip))
        {
            $completePath = $zipDir . dirname(zip_entry_name($zip_entry));
            $completeName = $zipDir . zip_entry_name($zip_entry);

            // Walk through path to create non existing directories
            // This won't apply to empty directories ! They are created further below
            if(!file_exists($completePath) && preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) ) )
            {
                $tmp = '';
                foreach(explode('/',$completePath) AS $k)
                {
                    $tmp .= $k.'/';
                    if(!file_exists($tmp) )
                    {
                        @mkdir($tmp, 0777);
                    }
                }
            }

            if (zip_entry_open($zip, $zip_entry, "r"))
            {
                if( preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) ) )
                {
                    if ($fd = @fopen($completeName, 'w+'))
                    {
                        fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
                        fclose($fd);
                    }
                    else
                    {
                        // We think this was an empty directory
                        mkdir($completeName, 0777);
                    }
                    zip_entry_close($zip_entry);
                }
            }
        }
        zip_close($zip);
    }
    return true;
}

// The call to exctract a path within the zip file
extractZip( 'clansuite.zip', 'core/filters' );
?>


2 commentaires

Si ($ zip) ne fonctionne pas, vous devez utiliser si (is_resource ($ zip)) . Voir ZIP_OPEN . En outre, le lien fourni dans la réponse n'est plus disponible.


N'utilisez pas zip_open / zip_read / etc - Ces fonctions ont été obsolètes à partir de PHP 8.0.0 . S'appuyant sur cette fonction est très découragé. Utilisez ZipRarchive à la place.



1
votes

Regardez la construction de fonctions ZIP: http://php.net/manual/fr/book.zip.php


1 commentaires

J'aime la classe "zipararchive".



0
votes

Le ZIP: // Protocol est fourni par le poste zip de php. Vérifiez votre phpinfo () Sortie si l'extension a été installée ou non.


5 commentaires

de phpinfo (): zip => Extension activée Version => $ ID: php_zip.c, v 1.1.2.38 2007/08/06 22:02:32 BJori exp $ zip Version => 2.0.0 Libzip version => 0.7. 1 Streams PHP enregistrés => Zip, PHP, fichier, données, http, ftp, compress.bzip2, compress.zlib, https, ftps


Avez-vous vérifié si le fichier que vous essayez d'ouvrir est en réalité un fichier .zip valide?


%> test de fichier.zip test.zip: données d'archives zip, au moins v2.0 à extraire


Code Snippet: $ Data = File_Get_Contents ('ZIP: ///PATH/TO/FILE/TEST.ZIP', FAUX, NULL, 0, 1024); Les données $ sont NULL que je suis vérifiée 1. Autorisations 2. Si c'est un format .zip approprié. Les fichiers zip peuvent-ils être lus de cette façon ???


Vous avez oublié de mentionner que le fichier ZIP contient toujours un fichier unique.



3
votes

Utiliser zipararchive classe xxx


0 commentaires

0
votes

Je réponds à la première partie de la question I.E. À l'aide de la méthode File_Get_Contents 'file_get_contents ("zip: //a/b/c.zip")' Habituellement, cette méthode est utilisée pour lire un fichier particulier imbriqué dans le fichier ZIP. Afin d'extraire tout le contenu; D'autres ont donné de belles réponses.

J'utilise PHP 7.2.34 sous Windows et plus tard sous Linux. J'ai gardé un fichier zip à D: \ Data et cette syntaxe fonctionne dans Windows. Il est echo le contenu de l'exemple1.py qui est à l'intérieur d'un "dossier" dans le fichier zip.

éventuellement il est également à voir avec où / comment le fichier zip a créé . Lorsque j'avais créé le fichier zip à partir de PHP, les délimiteurs internes étaient les barres backslashes, mais lorsque Windows a créé le fichier ZIP (à l'aide de la fonctionnalité "Envoyer to compressé" dans Windows Explorer), Windows utilisait la convention Linux dans le fichier ZIP!

Plus de test est nécessaire ici pour savoir quel délimiteur pour les chemins internes est utilisé dans le fichier zip xxx


0 commentaires