web-dev-qa-db-fra.com

php créer des zip sans chemin d'accès aux fichiers à l'intérieur du zip

J'essaie d'utiliser php pour créer un fichier Zip (ce qu'il fait - tiré de cette page - http://davidwalsh.name/create-Zip-php ), mais toutes les noms de dossier dans le fichier lui-même. 

Est-il possible d'avoir juste le fichier dans le zip moins tous les dossiers?

Voici mon code:

function create_Zip($files = array(), $destination = '', $overwrite = true) {

    if(file_exists($destination) && !$overwrite) { return false; };
    $valid_files = array();
    if(is_array($files)) {
        foreach($files as $file) { 
            if(file_exists($file)) { 
                $valid_files[] = $file;
            };
        };
    };
    if(count($valid_files)) { 
        $Zip = new ZipArchive();
        if($Zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
            return false;
        };
        foreach($valid_files as $file) { 
            $Zip->addFile($file,$file);
        };
        $Zip->close();
        return file_exists($destination);
    } else {
        return false;
    };

};


$files_to_Zip = array('/media/138/file_01.jpg','/media/138/file_01.jpg','/media/138/file_01.jpg');

$result = create_Zip($files_to_Zip,'/...full_site_path.../downloads/138/138_files.Zip');
45
SoulieBaby

Le problème ici est que $Zip->addFile reçoit les deux mêmes paramètres.

Selon la documentation :

bool ZipArchive ::ajouter le fichier ( chaîne $ filename [ chaîne $ localname ])

nom de fichier
Le chemin du fichier à ajouter.

nom_local
nom local dans l'archive Zip.

Cela signifie que le premier paramètre est le chemin du fichier dans le système de fichiers et le second est le chemin et le nom du fichier que le fichier aura dans l'archive.

Lorsque vous fournissez le second paramètre, vous voudrez en effacer le chemin lors de l'ajout à l'archive Zip. Par exemple, sur les systèmes Unix, ceci ressemblerait à ceci:

$new_filename = substr($file,strrpos($file,'/') + 1);
$Zip->addFile($file,$new_filename);
116
Nathan Osman

Je pense qu'une meilleure option serait:

$Zip->addFile($file,basename($file));

Ce qui extrait simplement le nom de fichier du chemin.

39
Carlos Évora

Ceci est juste une autre méthode que j'ai trouvée qui a fonctionné pour moi

$zipname = 'file.Zip';
$Zip = new ZipArchive();
$tmp_file = tempnam('.','');
$Zip->open($tmp_file, ZipArchive::CREATE);
$download_file = file_get_contents($file);
$Zip->addFromString(basename($file),$download_file);
$Zip->close();
header('Content-disposition: attachment; filename='.$zipname);
header('Content-type: application/Zip');
readfile($tmp_file);
0
FreeSoftwareServers