2016-02-05 1 views
0

Mon script PHP continue de se bloquer/expirer, probablement à cause du fichier readfile. Mon objectif est de générer le fichier zip, de le laisser télécharger par l'utilisateur et de supprimer le fichier zip par la suite.Le téléchargement du fichier readfile PHP expire

code:

<?php 

if(isset($_POST['version']) && isset($_POST['items']) && isset($_POST['identifier'])) { 

$identifier = $_POST['identifier']; 
$version = $_POST['version']; 
$tmp = dirname(__FILE__) . "/download/"; 
$zipfile = $tmp . $identifier . ".zip"; 
$name = "Program v" . $version . ".zip"; 
$path = dirname(__FILE__) . "\\download\\template\\" . $version; 

$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path), 
    RecursiveIteratorIterator::LEAVES_ONLY 
); 

$zip = new ZipArchive(); 

if ($zip->open($zipfile, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) { 

    foreach ($files as $name => $file) { 
     // Skip directories (they would be added automatically) 
     if (!$file->isDir()) { 
      // Get real and relative path for current file 
      $filePath = $file->getRealPath(); 
      $relativePath = substr($filePath, strlen($path) + 1); 

      //echo "adding " . $file . " as " . $relativePath; 
      // Add current file to archive 
      $zip->addFile($file, $relativePath); 
     } 
    } 

    $zip->close(); 
} else { 
    die('Error: Unable to create zip file'); 
} 

// Stream the file to the client 
header('Content-Type: application/zip'); 
header('Content-Length: ' . filesize($zipfile)); 
header('Content-disposition: attachment; filename="'.$name.'"'); 
readfile($zipfile); 
exit; 

} 

Tout fonctionne jusqu'à la partie de téléchargement. Le fichier zip est généré correctement sur le serveur, en cas de tentative de téléchargement, il se bloque.

Parfois, il affiche une erreur dans mes journaux, ce qui me dit qu'il attend un chemin valide et qu'un objet est donné. Même si elle met strictement une chaîne (le chemin).

Remarque: Le fichier fait moins de 300 KiB, donc je doute fortement que le serveur web manque de mémoire.

Je suis assez perdu, toute aide est très appréciée.

Répondre

1

Le problème est avec la génération du fichier ZIP. La méthode addFile nécessite un fichier le chemin comme premier paramètre, pas un objet. Voir la documentation:

bool ZipArchive::addFile (string $filename [, string $localname = NULL [, int $start = 0 [, int $length = 0 ]]])

http://php.net/manual/en/ziparchive.addfile.php

Par conséquent, dans votre cas l'expression correcte serait:

$zip->addFile($filePath, $relativePath);

+0

Merci! Cela a résolu le problème! – Erveon