web-dev-qa-db-fra.com

Créez un fichier Zip et téléchargez-le

J'essaie de télécharger 2 fichiers en créant le fichier Zip sur le serveur local.Le fichier est téléchargé au format Zip mais lorsque j'essaye de l'extraire, il donne une erreur: La signature du répertoire central de fin n'est pas trouvé. Soit ce fichier n'est pas un fichier Zip, soit il constitue un disque d'une archive en plusieurs parties. Dans ce dernier cas, le répertoire central et le commentaire du fichier Zip seront trouvés sur le (s) dernier (s) disque (s) de cette archive. =

le code suivant que j'utilise pour cela:

 <?php
$file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf');

//Archive name
$archive_file_name=$name.'iMUST_Products.Zip';

//Download Files path
$file_path=$_SERVER['DOCUMENT_ROOT'].'/Harshal/files/';


zipFilesAndDownload($file_names,$archive_file_name,$file_path);

function zipFilesAndDownload($file_names,$archive_file_name,$file_path)
{
        //echo $file_path;die;
    $Zip = new ZipArchive();
    //create the file and throw the error if unsuccessful
    if ($Zip->open($archive_file_name, ZIPARCHIVE::CREATE )!==TRUE) {
        exit("cannot open <$archive_file_name>\n");
    }
    //add each files of $file_name array to archive
    foreach($file_names as $files)
    {
        $Zip->addFile($file_path.$files,$files);
        //echo $file_path.$files,$files."

    }
    $Zip->close();
    //then send the headers to force download the Zip file
    header("Content-type: application/Zip"); 
    header("Content-Disposition: attachment; filename=$archive_file_name"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    readfile("$archive_file_name");
    exit;
}




?>

j'ai vérifié les valeurs de toutes les variables qui passent dans la fonction, toutes vont bien.Veuillez donc regarder ceci.Merci à l'avance.

30
Harshal Mahajan

Ajouter Content-length en-tête décrivant la taille du fichier Zip en octets.

header("Content-type: application/Zip"); 
header("Content-Disposition: attachment; filename=$archive_file_name");
header("Content-length: " . filesize($archive_file_name));
header("Pragma: no-cache"); 
header("Expires: 0"); 
readfile("$archive_file_name");

Assurez-vous également qu'il n'y a absolument aucun espace blanc avant <? et après ?>. Je vois un espace ici:

 <?php
$file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf');
37
Kuba Wyrostek
// http headers for Zip downloads
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filepath.$filename));
ob_end_flush();
@readfile($filepath.$filename);

J'ai trouvé cette soludtion ici et ça marche pour moi

6
vitams
$Zip = new ZipArchive;
$tmp_file = 'assets/myzip.Zip';
    if ($Zip->open($tmp_file,  ZipArchive::CREATE)) {
        $Zip->addFile('folder/bootstrap.js', 'bootstrap.js');
        $Zip->addFile('folder/bootstrap.min.js', 'bootstrap.min.js');
        $Zip->close();
        echo 'Archive created!';
        header('Content-disposition: attachment; filename=files.Zip');
        header('Content-type: application/Zip');
        readfile($tmp_file);
   } else {
       echo 'Failed!';
   }
5
M Arfan

L'une des erreurs pourrait être que le fichier n'est pas lu au format "archive". consultez ZipArchive n'ouvre pas le fichier - Code d'erreur: 19 . Ouvrez le fichier téléchargé dans l'éditeur de texte, si vous avez des balises html ou des instructions de débogage au début, videz le tampon avant de lire le fichier.

ob_clean();
flush();
readfile("$archive_file_name");
2
Avinav

Je viens de rencontrer ce problème. Pour moi, le problème était avec:

readfile("$archive_file_name");

Cela entraînait une erreur de mémoire insuffisante.

Allowed memory size of 134217728 bytes exhausted (tried to allocate 292982784 bytes)

J'ai pu corriger le problème en remplaçant readfile () par ce qui suit:

    $handle = fopen($zipPath, "rb");
    while (!feof($handle)){
        echo fread($handle, 8192);
    }
    fclose($handle);

Je ne sais pas si c'est votre même problème ou si vous ne voyez pas que votre fichier ne fait que 1,2 Mo. Peut-être que cela aidera quelqu'un d'autre avec un problème similaire.

2
David Rodriguez

J'ai rencontré exactement le même problème. Dans mon cas, la source était les autorisations du dossier dans lequel je voulais créer le fichier Zip qui étaient tous définis en lecture seule. Je l'ai changé pour lire et écrire et cela a fonctionné.

Si le fichier n'est pas créé sur votre serveur local lorsque vous exécutez le script, vous avez probablement le même problème que moi.

1
user2752793

mais le fichier que je reçois du serveur après le téléchargement donne la taille de 226 octets

Il s'agit de la taille d'un en-tête Zip. Apparemment il n'y a pas de données dans le fichier Zip téléchargé. Alors, pouvez-vous vérifier que les fichiers à ajouter dans le fichier Zip sont bien là (par rapport au chemin du téléchargement PHP)?

Pensez également à ajouter une vérification sur addFile:

foreach($file_names as $file)
{
    $inputFile = $file_path . $file;
    if (!file_exists($inputFile))
        trigger_error("The input file $inputFile does not exist", E_USER_ERROR);
    if (!is_readable($inputFile))
        trigger_error("The input file $inputFile exists, but has wrong permissions or ownership", E_USER_ERROR);
    if (!$Zip->addFile($inputFile, $file))
        trigger_error("Could not add $inputFile to Zip file", E_USER_ERROR);
}

Le comportement observé est cohérent avec certains problèmes (erreur de chemin d'accès, problèmes d'autorisation, ...) empêchant les fichiers d'être ajoutés au fichier Zip. À la réception d'un fichier Zip "vide", le client émet une erreur se référant au répertoire central Zip manquant (l'erreur réelle étant qu'il n'y a pas de répertoire et pas de fichiers).

0
LSerni