Version complète: sur le forum Webmaster Hub : Supprimer un fichier après son téléchargement
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
salcamden
Bonjour,

Je suis en train de développer un script de téléchargement de fichier .zip (assez volumineux).

Mon script fait les choses suivantes :

Vérification des droits de téléchargement
Création de l'archive à la volée
téléchargement de l'archive
suppression du fichier télécharger du serveur

Je butte sur la dernière étape, le fichier, une fois téléchergé n'est pas supprimé du serveur (le téléchargement est assez long car il s'agit de fichiers de plus de 100 Mo, généralement.

Voici le code :

CODE
<?php
// Ici, le script de vérification d'autorisation

...

// fin du script d'autorisation

include('./_inc/pclzip.lib.php');

// Fonction d'effacement récursif d'un dossier

function deltree($dossier){
    if(($dir=opendir($dossier))===false)
    return;
    
    while($name=readdir($dir)){
    if($name==='.' or $name==='..')
    continue;
    $full_name=$dossier.'/'.$name;
    
    if(is_dir($full_name))
    deltree($full_name);
    else unlink($full_name);
    }
    
    closedir($dir);
    
    @rmdir($dossier);
}

// Récupération des fichiers à intégrer au zip

$sql = "Recupération des infos";
//echo $sql;
$res = mysql_query($sql);

$album_courant = "";
$album_dossier = "";

$nb_res = mysql_affected_rows();

if($nb_res>0){
    
    // Création du dossier temporaire
    
    $tmp_nom_global = $_SESSION['id_membre'].time();
    $tmp_dossier = './_tmp/'.$tmp_nom_global;
    mkdir($tmp_dossier);
    
    // copie des fichiers de packaging
    copy('./_tmp/Conditions_Generales_de_Vente.pdf','./_tmp/'.$tmp_nom_global.'/Conditions_Generales_de_Vente.pdf');
    copy('./_tmp/lienverslesite.URL','./_tmp/'.$tmp_nom_global.'/lienverslesite.URL');

    while($fichier = mysql_fetch_array($res)){
        
        // Pour chaque album
        if($album_courant!=$fichier['nom_album']){
            // création d'un dossier pour l'album en cours
            $interdit=array(">", "<",  ":", "*","\\", "/", "|", "?", " ", ",", ".", ";", "*", "#", "\"" );
            $tmp_nom = str_replace($interdit, "_", $fichier['nom_album']);
            
            $album_dossier = $tmp_dossier.'/'.$tmp_nom;
            mkdir($album_dossier);
            $album_courant = $fichier['nom_album'];
        }
        
        // copie du fichier courant dans le dossier correspondant
        $interdit=array(">", "<",  ":", "*","\\", "/", "|", "?", ",", ".", ";", "*", "#", "\"" );
        $tmp_nom = str_replace($interdit, "_", $fichier['nom_cd']).".mp3";
    //    echo "source = "."./chemin/fichier/source/".$fichier['nom_cd'].".mp3";
        copy("./chemin/fichier/source/".$fichier['id_cd'].".mp3",$album_dossier."/".$tmp_nom);    
        
    }

    // Création du fichier d'archive
    
    $archive = new PclZip('./_tmp/'.$tmp_nom_global.'.zip');
    if ($archive->create($tmp_dossier, PCLZIP_OPT_REMOVE_PATH, '_tmp/'.$tmp_nom_global) == 0) {
        die('Error : '.$archive->errorInfo(true));
    }
    
// Suppression des fichiers et dossiers servant à créer l'archive

deltree('./_tmp/'.$tmp_nom_global);
    
// Transfert du fichier

$fichier = './_tmp/'.$tmp_nom_global.'.zip';

// Nous extrayons les informations grâce à $fichier
$fichier_nom = basename($fichier);
$fichier_taille = filesize($fichier);

// téléchargement du fichier

//header("Content-Type: application/octet-stream" );
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=hiphopcommunities_".$tmp_nom_global.".zip");
header("Content-Description: File Transfert" );
header("Content-Transfer-Encoding: binary" );
header("Content-Length: $fichier_taille" );
header("Pragma: no-cache" );
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
header("Expires: 0" );/**/

//echo $data;
readfile($fichier);

// effacement du .zip

unlink($fichier);

}

?>


Le dernier unlink ne semble pas s'éxécuter (je pense que le temps d'éxécution du script y est pour qqchose).

Merci.
rdd
Bonjour,

Et que donne un
CODE
exec('rm -f $fichier')
a la place de ton unlink ?

Peut-etre est-ce aussi une question de droit (l'archive ne doit pas etre creee avec les droits suffisants pour la suppression).
Kioob
Hello,

s'il n'est pas déjà activé un "ignore_user_abort()" est peut-être nécessaire afin d'assurer l'exécution du unlink(), non ?
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.