Supprimer plusieur fichiers

Mammouth du PHP | 620 Messages

20 août 2010, 12:48

Bonjour,
sur mon site j'affiche le contenu d'un repertoire (tout les fichiers).
je voudrai savoir si il est possible a l'affichage de cette liste d'avoir une petite case a cocher a coté de chaque nom de fichier et de supprimer tout les fichiers qui sont cocher.

actuellement j'utilise ce code pour afficher les fichiers.
// si les fichiers sont dans ../mesmp3/ et que l'on ne veu que les fichiers d'extension .mp3 (et pas les fichiers ayant une autre extension)
$dossier = '../mesmp3/';
$extension = '.mp3';

$masque = $dossier.'*'.$extension;
//Tableau des fichiers .mp3   
$tab = glob("$masque");
natsort($tab);

// Construction du tableau des résultats
$tab_nom_desc = array();
$i=0;
foreach ($tab as $fichier)
{
        $fich = basename($fichier,$extension);// suppression du nom de dossier et de l'extension
        $fich = str_replace('-',' ',$fich);// remplacement des - par un espace
        $fich = explode('_',$fich);// Cf fonction explode

        $nom = $fich[0];
        $desc = isset($fich[1])? $fich[1] : '';
        
        $tab_nom_desc[$i]['nom'] = $nom;
        $tab_nom_desc[$i]['desc'] = $desc;
        $tab_nom_desc[$i]['lien'] = $fichier;
        
        $i++;
}
?>
<table border="0" cellspacing="5" cellpadding="0">
  <tr>
    <th scope="col"></th>
    <th scope="col">Artiste</th>
    <th scope="col">Titre</th>
    <th scope="col">Extrait</th>
    <th scope="col">Poids</th>
  </tr>
<?php
$j=0;
//lecture des résultats
foreach ($tab_nom_desc as $value) 
{  
?>  
  <tr>
    <td bgcolor="#D6D6FE"><?php $j++; echo $j; ?></td>
    <td><?php echo htmlentities(strtoupper($value['nom'])); // strtoupper pour tout en majuscule ?></td>
    <td><?php echo htmlentities(ucfirst($value['desc'])); // ucfirst pour mettre majuscule en debut ?></td>
    <td>
            <object type="application/x-shockwave-flash" data="dewplayer.swf?mp3=<?php echo $value['lien']; ?>" width="200" height="20" id="dewplayer">
            <param name="wmode" value="transparent" />
            <param name="movie" value="dewplayer.swf?mp3=<?php echo $value['lien']; ?>" />
        	</object> 
    </td>
    <td>
	<?php 
	$sizeo = filesize ($value['lien']);
	$size1 = ($sizeo / 1000000);
	$size = round($size1, 1); 
	echo $size.' Mo'; 
	?></td>
  </tr>
<?php } ?>  
</table>

Mammouth du PHP | 686 Messages

20 août 2010, 12:53

Biensur,
il suffit que tu déclare un formulaire, tu liste tes fichiers,
en valeur des cases à cocher pour chaque fichier tu lui attribue le nom du fichier par exemple.
Lorsque l'utilsateur valide, le formulaire est posté.
Tu n'as plus qu'à traiter le formulaire posté dans une boucle en récupérant nom des fichiers à supprimer (valeur des cases cochées)

Mammouth du PHP | 620 Messages

20 août 2010, 13:22

ok, voilà se que j'ai fais :
j'ai déclaré avant mon tableau le formulaire que je referme a lma fin du tableau.
pour chaque fichiers affiché j'ai ajouté (mais je suis pas sur):
<input type="checkbox" name="<?php echo $value['lien']; ?>" id="supp" />
ensuite en fin de formulaire je met un bouton que je nomme "supprimer les fichiers"

le code modifié :
<form id="form1" name="form1" method="post" action="#">
<table border="0" cellspacing="5" cellpadding="0">
  <tr>
    <th scope="col"></th>
    <th scope="col"></th>
    <th scope="col">Artiste</th>
    <th scope="col">Titre</th>
    <th scope="col">Extrait</th>
    <th scope="col">Poids</th>
  </tr>
<?php
$j=0;
//lecture des résultats
foreach ($tab_nom_desc as $value) 
{  
?>  
  <tr>
    <td bgcolor="#D6D6FE">
    
    <input type="checkbox" name="<?php echo $value['lien']; ?>" id="supp" />
    </td>
    <td bgcolor="#D6D6FE"><?php $j++; echo $j; ?></td>
    <td><?php echo htmlentities(strtoupper($value['nom'])); // strtoupper pour tout en majuscule ?></td>
    <td><?php echo htmlentities(ucfirst($value['desc'])); // ucfirst pour mettre majuscule en debut ?></td>
    <td>
            <object type="application/x-shockwave-flash" data="dewplayer.swf?mp3=<?php echo $value['lien']; ?>" width="200" height="20" id="dewplayer">
            <param name="wmode" value="transparent" />
            <param name="movie" value="dewplayer.swf?mp3=<?php echo $value['lien']; ?>" />
        	</object>    </td>
    <td>
	<?php 
	$sizeo = filesize ($value['lien']);
	$size1 = ($sizeo / 1000000);
	$size = round($size1, 1); 
	echo $size.' Mo'; 
	?></td>
  </tr>
<?php } ?>  
</table>
<input name="" type="button" value="Supprimer les fichiers" />
</form>
maintenant il faut que je supprimer les fichiers coché

j'aimagine que l'on doit utiliser la fonction unlink($chemin); //on efface mais je pense qu'il me manque de elemants.

Mammouth du PHP | 686 Messages

20 août 2010, 14:24

Oui c'est ca mais il faut que tu renseigne la valeur du champs.
J'ai cru voir que ta variable $j s'incrementait toute seule donc
Le mieux c'est
<input type="checkbox" name="suppr_<?php echo $j; ?>" value="<?php echo $value['lien']; ?>" id="supp" />
et pour ton bouton
<input name="supprimer_fichiers" type="button" value="Supprimer les fichiers" />
Et pour le traitement de la boucle :
if($_POST['supprimer_fichiers'] != ""){
/// on récupère le nombre d'éléments postés
$fichiers = array_values($_POST);
$nbre_fichiers = count($fichiers);
/// On enlève la valeur du bouton (car il fait parti des valeurs postées)
$nbre_fichiers = $nbre_fichiers-1;
// on fait la boucle pour supprimer
for($i=0; $i<= $nbre_fichiers; $i++){
unlink($fichiers[$i]);
}
}
J'ai pas tésté mais ca devrai te donner une excellente piste de travail

Mammouth du PHP | 620 Messages

20 août 2010, 15:07

Merci sylvain.
j'essai de faire fonctionner ta solution mais au final je n'ai toujours aucun fichiers qui se supprime.
as tu une idées du pourquoi ?

SI C'EST BON SA FONCTIONNE ! C'etait mon bouton qui n'etait pas bon j'ai corrigé.

voici le code complet que j'utilise :
 <?php
if($_POST['supprimer_fichiers'] != ""){
/// on récupère le nombre d'éléments postés
$fichiers = array_values($_POST);
$nbre_fichiers = count($fichiers);
/// On enlève la valeur du bouton (car il fait parti des valeurs postées)
$nbre_fichiers = $nbre_fichiers-1;
// on fait la boucle pour supprimer
for($k=0; $k<= $nbre_fichiers; $k++){
unlink($fichiers[$k]);
}
}
  ?> 
   
   <?php 

// si les fichiers sont dans ../mesmp3/ et que l'on ne veu que les fichiers d'extension .mp3 (et pas les fichiers ayant une autre extension)
$dossier = '../mesmp3/';
$extension = '.mp3';

$masque = $dossier.'*'.$extension;
//Tableau des fichiers .mp3   
$tab = glob("$masque");
natsort($tab);

// Construction du tableau des résultats
$tab_nom_desc = array();
$i=0;
foreach ($tab as $fichier)
{
        $fich = basename($fichier,$extension);// suppression du nom de dossier et de l'extension
        $fich = str_replace('-',' ',$fich);// remplacement des - par un espace
        $fich = explode('_',$fich);// Cf fonction explode

        $nom = $fich[0];
        $desc = isset($fich[1])? $fich[1] : '';
        
        $tab_nom_desc[$i]['nom'] = $nom;
        $tab_nom_desc[$i]['desc'] = $desc;
        $tab_nom_desc[$i]['lien'] = $fichier;
        
        $i++;
}
?>
<form method="post" enctype="multipart/form-data" action="#">
<table border="0" cellspacing="5" cellpadding="0">
  <tr>
    <th scope="col"></th>
    <th scope="col"></th>
    <th scope="col">Artiste</th>
    <th scope="col">Titre</th>
    <th scope="col">Extrait</th>
    <th scope="col">Poids</th>
  </tr>
<?php
$j=0;
//lecture des résultats
foreach ($tab_nom_desc as $value) 
{  
?>  
  <tr>
    <td bgcolor="#D6D6FE">
	<input type="checkbox" name="suppr_<?php echo $j; ?>" value="<?php echo $value['lien']; ?>" id="supp" />
    </td>
    <td bgcolor="#D6D6FE"><?php $j++; echo $j; ?></td>
    <td><?php echo htmlentities(strtoupper($value['nom'])); // strtoupper pour tout en majuscule ?></td>
    <td><?php echo htmlentities(ucfirst($value['desc'])); // ucfirst pour mettre majuscule en debut ?></td>
    <td>
            <object type="application/x-shockwave-flash" data="dewplayer.swf?mp3=<?php echo $value['lien']; ?>" width="200" height="20" id="dewplayer">
            <param name="wmode" value="transparent" />
            <param name="movie" value="dewplayer.swf?mp3=<?php echo $value['lien']; ?>" />
        	</object>    </td>
    <td>
	<?php 
	$sizeo = filesize ($value['lien']);
	$size1 = ($sizeo / 1000000);
	$size = round($size1, 1); 
	echo $size.' Mo'; 
	?></td>
  </tr>
<?php } ?>  
</table>
<input name="supprimer_fichiers" type="submit" id="button" value="Supprimer les fichiers" />

</form>

Par contre je rencontre un problémé avec certain nom de fichiers (je sais c'est pas fien mais j'ai pas le choix).
Certains nom s'appel par exemple : l'histoire-sans-fin_auteur.mp3
ces fichiers ne veulent pas se supprimer pourquoi ? j'imagine que c'est a cause du l'apostro^he alors comment onctourner ce probleme ?

Mammouth du PHP | 686 Messages

20 août 2010, 15:30

lorsque tu poste avec un formulaire, il ajoute des slashes aux apostrophes
il faut que dans le taitement tu enlève

dans le traitement, rajoute
<?php
if($_POST['supprimer_fichiers'] != ""){
/// on récupère le nombre d'éléments postés
$fichiers = array_values($_POST);
$nbre_fichiers = count($fichiers);
/// On enlève la valeur du bouton (car il fait parti des valeurs postées)
$nbre_fichiers = $nbre_fichiers-1;
// on fait la boucle pour supprimer
for($k=0; $k<= $nbre_fichiers; $k++){
//// LA MODIFICATION EST ICI
unlink(stripslashes($fichiers[$k]));
}
}
  ?> 


Mammouth du PHP | 686 Messages

20 août 2010, 15:42

Après c'est peut être au niveau du serveur ... Voir comment il gère les apostrophes dans les noms de fichiers.
Et si tu fais un essai en tapant directement le nom du fichier dans le unlink ca marche ?

faire des essais avec
$fichier = "l'histoiresansfin.mp3";
unlink($fichier);
unlink(addslashes($fichier));
...
Essai comme ca si ca veut vraiment pas

ViPHP
AB
ViPHP | 5818 Messages

20 août 2010, 18:45

Par contre je rencontre un problémé avec certain nom de fichiers (je sais c'est pas fien mais j'ai pas le choix).
C'est surtout que tu ne veux pas te donner les moyens d'avoir le choix.

Rien ne t'empêche de faire un script d'upload pour télécharger tes fichiers et qui remplacera les caractères spéciaux ou accentués lors du téléchargement pour avoir des noms compatibles avec tous les serveurs. Par exemple en utilisant cette classe de téléchargement ou en prenant exemple sur la fonction "Nettoie_nom_fichier" de cette même classe.

Et si tu télécharge directement par ftp, rien ne t'empêche de lancer un script qui fera la même opération sur les fichiers téléchargés.

Si quand tu fais des téléchargements sur internet tu constates que tous les fichiers sont dépourvus de caractères spéciaux (excepté les' _' et '-' )ou accentués, ce n'est pas tout à fait par hasard !

ViPHP
AB
ViPHP | 5818 Messages

20 août 2010, 19:00

lorsque tu poste avec un formulaire, il ajoute des slashes aux apostrophes
Normalement plus maintenant car magic_quotes_gpc n'est plus activée par défaut dans les config et cette fonction est maintenant dépréciée en php 5.3.
Cela dit effectivement certains serveurs sont encore configurés avec magic_quotes_gpc sur on et cela ajoute donc des \ dans les variables get, post et cookie devant les ', " , \, et NULL.

Pour avoir un code qui passe partout on peut donc faire par exemple :
function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);

return $chaine;
} 

$var = isset($_POST['var'])? Verif_magicquotes($_POST['var']) : null;
C'est mieux que d'appliquer directement stripslashes qui posera problème en cas de changement de configuration :wink:

Mammouth du PHP | 686 Messages

20 août 2010, 19:12

lorsque tu poste avec un formulaire, il ajoute des slashes aux apostrophes
Normalement plus maintenant car magic_quotes_gpc n'est plus activée par défaut dans les config et cette fonction est maintenant dépréciée en php 5.3.
Cela dit effectivement certains serveurs sont encore configurés avec magic_quotes_gpc sur on et cela ajoute donc des \ dans les variables get, post et cookie devant les ', " , \, et NULL.

Pour avoir un code qui passe partout on peut donc faire par exemple :
function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);

return $chaine;
} 

$var = isset($_POST['var'])? Verif_magicquotes($_POST['var']) : null;
C'est mieux que d'appliquer directement stripslashes qui posera problème en cas de changement de configuration :wink:

C'est noté :wink: