Supprimer un fichier d'une arborescence [Résolu]

Signaler
Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
-
Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
-
Bonjour, J'ai actuellement une fonction qui me retourne une arborescence de dossiers et me liste mes fichiers, ce qui fonctionne très bien. Je souhaiterai pouvoir supprimer de façon sélective des fichiers si besoin. J'ai créé un lien avec une image pour sélectionner chaque image. Malheureusement je ne sais pas mettre en place la fonction "unlink" pour la suppression, en ayant regardé beaucoup de tutos à ce sujet. Pouvez-vous m'aider s'ils vous plait. Je vous remercie.
function explore_dir_scan_html($dir, $dirpub, $niv = 0, $id = 0) {
	$html = null;
	$html_dirs = null;
	$html_fils = null;
	if($niv == 0) { $html .= '	<ul>'."\n"; }
	if ($handle = opendir($dir)) {
		$dirFiles = array();
		while (false !== ($entry = readdir($handle))) {
			$dirFiles[] = $entry;
			$id++;
		}
		sort($dirFiles, SORT_NATURAL | SORT_FLAG_CASE);
		foreach($dirFiles as $entry) {
			if(is_dir($dir.'/'.$entry)) { // dossier
				if($entry != '..' && $entry != '.') {
					$html_dirs .= str_repeat("\t",$niv + 1).'<li class="dir" id="div_'.$id.'">'.$entry."\n";
					$html_dirs .= str_repeat("\t",$niv + 2).'<ul class="sub_dir" id="sub_'.$id.'">'."\n";
					$html_dirs .= explore_dir_scan_html($dir.'/'.$entry, $dirpub.'/'.$entry, $niv+1, $id);
				}				
			} else { // fichier
				$html_fils .= str_repeat("\t",$niv + 2).'<li class="fil" id="fil_'.$id.'"><a href="'.$entry.'"><img src="img/supp.png " alt="supp"/></a><a href="'.$dirpub.'/'.$entry.'" target="_blank">'.$entry.'</a></li>'."\n";
			}
			if(is_dir($dir.'/'.$entry)) { 
				if($entry != '..' && $entry != '.') {
					$html_dirs .= str_repeat("\t",$niv + 2).'</ul>'."\n";
					$html_dirs .= str_repeat("\t",$niv + 1).'</li>'."\n";
				}
			}
		}
		closedir($handle);
		$html .= $html_dirs; // dossiers
		$html .= $html_fils; // fichiers
	}    
	if($niv == 0) { $html .= '	</ul>'."\n"; }
	return $html;
};
echo '<nav id="explorateur-dossier">';
echo explore_dir_scan_html('/home/site/www/upload/albulle/data/photos/','http://www.monsite.fr/upload/albulle/data/photos/');
echo '</nav>';

10 réponses

Messages postés
11512
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 juillet 2020
659
bonjour, quel est l'obstacle à la mise en place la fonction "unlink" pour la suppression?
Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
14
Bonjour, En fait je ne sais pas ou la positionner pour avoir une condition par exemple.
Etes vous sur de vouloir supprimer le fichier azerty.jpg ? oui - non
Merci pour votre aide.
Messages postés
11512
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 juillet 2020
659
as-tu décidé comment le site allait interagir avec l'utilisateur pour cette suppression de fichier?
une méthode simple (à programmer) serait d'envoyer à l'utilisateur une page avec des liens de suppression pour chacun des fichiers.
Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
14
j'ai oublié de préciser que seul l'administrateur allait pouvoir supprimer une photo au même titre qu'il insert les photos pour la galerie avec un formulaire qui lui est dédié.
Messages postés
11512
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 juillet 2020
659
tu n'as pas répondu à ma question en #3.
une question supplémentaire: comment détermines-tu qu'il s'agit de l'administrateur?
Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
14
Pour l'administrateur du site il existe un sous domaine avec un fichier htaccess et passwd ou il gére la totalité du site, membres galerie etc...
Messages postés
11512
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 juillet 2020
659
tu n'as pas répondu à ma question en #3.
Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
14
c'est cette question "as-tu décidé comment le site allait interagir avec l'utilisateur pour cette suppression de fichier?"
je ne saisi pas trop ce que tu me demande car je ne vois pas la relation entre le site avec l'utilisateur et la suppression d'une photo.
Lorsque l'admin supprime une photo elle sera tout simplement supprimer de la galerie du site.
Je ne sais pas si cela réponds à ta question sinon peux tu me l'a reformuler, merci.
Messages postés
28938
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 juillet 2020
2 609
Bonjour,
L'utilisateur... c'est celui qui UTILISE ... peut importe qu'il ait un rôle d'administrateur ou non.
Par exemple.. toi tu es un UTILISATEUR du forum commentcamarche.net ..... moi aussi (bien que modérateur..)
Bref...
Pour reformuler la question d' Yg_be ...
Comment, la personne qui va devoir supprimer les photos, va t-elle procéder ?
Car, comme il te l'a proposé, le plus simple serait de mettre un bouton ( un lien....) à chaque Image pour que lorsqu'il cliquera dessus ( il = l'utilisateur = une personne qui va utiliser la page = l'administrateur ) puisse demander la suppression du fichier.
Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
14
Bonjour
Merci pour vos explications très explicite. Par contre j'ai créé un lien pour la suppression sélective de photos avec le chemin absolu mais cela me retourne une erreur. Pourtant le chemin est correct. Pouvez-vous me dire ce que vous en pensez, merci.
Warning: unlink(/home/site/www/upload/albulle/data/photos/585532_0.jpg): No such file or directory in...

$supp = ('/home/site/www/upload/albulle/data/photos');
$html_fils .= str_repeat("\t",$niv + 2).'<li class="sup" id="fil_'.$id.'"><a href="'.unlink($supp.'/'.$entry).'"><img src="img/supp.png " alt="supp"/></a><a href="'.$dirpub.'/'.$entry.'" target="_blank">'.$entry.'</a></li>'."\n";
Messages postés
11512
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 juillet 2020
659
si je comprends bien, tu as donc choisi d'offrir à l'utilisateur un lien qui lui permettra, en cliquant ce lien, de déclencher la suppression du fichier.
pour réaliser cela, je suggère de faire ainsi:
- créer une nouvelle page php, disons supprimerfichier.php, dans laquelle et vas verifier que l'utilisateur est bien l'administrateur, qui va récupérer le nom du fichier, et qui va supprimer le fichier.
- dans ta page qui envoie la liste des fichiers, envoyer aussi des liens vers la nouvelle page, incluant le nom relatif du fichier à supprimer, par exemple:
supprimerfichier.php/?fic=585532_0.jpg
Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
14
Bonjour, en fait je m'explique mal dans ma tête c'est clair mais mes explications ne le sont pas. Il n'y a pas besoin de vérifier si l'utilisateur est l'administrateur.
J'ai créé un sous domaine exemple.
www.gestion.monsite.fr
Une personne se connecte par le biais des fichiers htaccess et passwd. et là il y a le formulaire pour insérer les photos et beaucoup d'autre chose concernant la gestion du site.
Je souhaite simplement créé un lien supprimer à ma liste de photo et en cliquant dessus cela me supprime la photo.
Messages postés
11512
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 juillet 2020
659
le lien "supprimer" ne peut pas supprimer la photo de la manière dont tu l'imagines. le lien doit faire appel à une page php qui va supprimer la photo. le lien sera donc, par exemple:
supprimerfichier.php/?fic=585532_0.jpg


supprimerfichier.php est une nouvelle page, à créer, bien protégée dans le sous domaine réservé aux administrateurs, et, dans cette page, le code PHP va récupérer le nom du fichier, et va supprimer le fichier.
Messages postés
28938
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 juillet 2020
2 609
Bonjour,

Le message d'erreur

Warning: unlink(/home/site/www/upload/albulle/data/photos/585532_0.jpg): No such file or directory in...

Indique qu'il ne trouve pas le fichier à l'emplacement indiqué.
Soit il n'a pas le bon nom, soit le chemin n'est pas le bon...

Pour que l'on puisse t'aider il faudrait que l'on puisse voir le code PHP qui fait le unlink...
Il faudrait également que tu nous confirmes le chemin EXACT de tes fichiers (celui de l'exemple )...
Attention à bien respecter les Majuscules/Miunuscules...

Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
14
Bonjour,
Là je suis vraiment perdu.
Je vais essayer de vous détaillé très précisément. J'ai une page avec mon formulaire d'insertion de photo qui marche bien. Sur la même page une fonction qui me permet d'avoir l'arborescence de ma galerie qui fonctionne également bien.
Dans cette fonction il y a un lien qui me permet d'ouvrir chaque photo sur ce lien j'ai rajouté une image qui me renvoie sur une autre page "supp_photo.php" afin de supprimer chaque photo de façon sélective et c'est là que je suis perdu à propos su script de suppression. Je vous remercie.
Insertion galerie
$action 	= 'new';
$a 			= !empty($_GET['a']) ? $_GET['a'] : NULL;
$submit 	= !empty($_POST['submit']) ? $_POST['submit'] : NULL;
$haction 	= !empty($_POST['haction']) ? $_POST['haction'] : NULL;

$idfoto 	= !empty($_REQUEST['idfoto']) ? $_REQUEST['idfoto'] : NULL;
$datefoto 	= !empty($_POST['datefoto']) ? dw2m($_POST['datefoto']) : '';
$lieufoto 	= !empty($_POST['lieufoto']) ? strtoupper($_POST['lieufoto']) : '';
$files 		= !empty($_FILES['namefoto']) ? $_FILES['namefoto'] : '';
$fileName 	= !empty($files['name']) ? $files['name'] : '';
$fileTemp 	= !empty($files['tmp_name']) ? $files['tmp_name'] : '';

switch($a) {
	case 'new': $action = 'new';  break;
	case 'ls' : $action = 'list'; break;
	default   : $action = 'new';  break; 
}

if($submit) {

	switch($haction) {
		case 'new':

			$dossier = '/home/site/www/upload/albulle/data/photos/'.date("Y", strtotime($datefoto)).'/'.dFR($datefoto).'/'.$lieufoto.'/';

			for ($i = 0; $i < count($fileName); $i++) {
				// Si un fichier a été sélectionné
				if ($fileName[$i] != NULL) {
					//Récupération de l'extension du fichier
					$extension_upload = strtolower(  substr(  strrchr($fileName[$i], '.')  ,1));
					//Liste des extensions autorisées
					$extension_valide = array('jpg', 'gif', 'png', 'jepg');
					if (in_array($extension_upload,$extension_valide)) {
						$fichier_Upload = $fileTemp[$i];
						$random = rand(537317, 985120);
						$fichier_New = "$dossier/" . $random . "_$i" . "." . $extension_upload;
						//On autorise uniquement les fichiers image de type gif, jpeg et png
						$type_autorises = array('image/jpg', 'image/gif', 'image/png', 'image/jpeg');
						//On récupérer le type MIME du fichier en utilisant la fonction image_type_to_mime_type()
						$fichier_type = image_type_to_mime_type(exif_imagetype($fichier_Upload));
						//On vérifie que le type MIME appartient aux fichiers autorisés
						if(in_array($fichier_type, $type_autorises)) {
							if(!is_dir('/home/site/www/upload/albulle/data/photos/'.date("Y", strtotime($datefoto)).'/'.dFR($datefoto).'/'.$lieufoto.'/')) {
								mkdir('/home/site/www/upload/albulle/data/photos/'.date("Y", strtotime($datefoto)).'/'.dFR($datefoto).'/'.$lieufoto.'/', 0755, true);
							}
							if (move_uploaded_file($fichier_Upload, $fichier_New)) {
								resize_img($fichier_New,$max_size = 1280,$qualite = 100,$type = 'auto');
								$typenr = "enregistré";
								$success = "<span class='success'>Saisie photos du - ".dFR("$datefoto")." - a été $typenr.</span>";	
							}
						} else {
							$erreur = "<span class='erreur'>Seul les fichiers images sont autorisés !</span>";
						}
					} else {
						$erreur = "<span class='erreur'>L'extension du fichier n'est pas autorisée !</span>";
					}
				} else {
					$erreur = "<span class='erreur'>Veuillez sélectionner un fichier !</span>";
				}
			}
		break;
	}
}

switch($action) {
	case 'new':   
		$title      = "Saisie Photos";
		$btsub      = "Enregistrer";
		$datefoto  	= "";
		$lieufoto  	= "";
		$files  	= "";
		break;
	
	case 'list': 
		$title  	= "Supprimer des Photos";
		break;
}
?>

fonction arborescence galerie
<script>
// OUVRIR / FERMER les DOSSIERS : AVEC jQuery
$(document).ready(function() {
	$('#explorateur-dossier').on('click', '.dir', function(event) {
		$(this).find('ul').first().slideToggle();
		event.stopPropagation(); // important
	});
});
</script>

<style>
#explorateur-dossier ul { margin:0; padding:0; list-style:none outside none; }
#explorateur-dossier .dir { position:relative; padding-left:20px; cursor:pointer; border:solid 1px #c0bbba; }
#explorateur-dossier .dir:hover { background-color:#FFFF80; }
#explorateur-dossier .sub_dir { position:relative; padding-left:20px; cursor:pointer; display:none; border:solid 0px #FF0000;; }
#explorateur-dossier .fil { position:relative; padding-left:20px; }
#explorateur-dossier .dir:before { position:absolute; content:''; display:block; width:16px; height:16px; top:2px; left:0; background:url(img/folder.png) no-repeat; }
</style>

<?php
function explore_dir_scan_html($dir, $dirpub, $niv = 0, $id = 0) {
	$html = null;
	$html_dirs = null;
	$html_fils = null;
	if($niv == 0) { $html .= '	<ul>'."\n"; }
	if ($handle = opendir($dir)) {
		$dirFiles = array();
		while (false !== ($entry = readdir($handle))) {
			$dirFiles[] = $entry;
			$id++;
		}
		sort($dirFiles, SORT_NATURAL | SORT_FLAG_CASE);
		foreach($dirFiles as $entry) {
			if(is_dir($dir.'/'.$entry)) { // dossier
				if($entry != '..' && $entry != '.') {
					$html_dirs .= str_repeat("\t",$niv + 1).'<li class="dir" id="div_'.$id.'">'.$entry."\n";
					$html_dirs .= str_repeat("\t",$niv + 2).'<ul class="sub_dir" id="sub_'.$id.'">'."\n";
					$html_dirs .= explore_dir_scan_html($dir.'/'.$entry, $dirpub.'/'.$entry, $niv+1, $id);
				}				
			} else { // fichier
				$html_fils .= str_repeat("\t",$niv + 2).'<li class="fil" id="fil_'.$id.'"><a href="supp_photo.php?'.$entry.'"><img src="img/supp.png " alt="supp"/></a><a href="'.$dirpub.'/'.$entry.'" target="_blank">'.$entry.'</a></li>'."\n";
			}
			if(is_dir($dir.'/'.$entry)) { 
				if($entry != '..' && $entry != '.') {
					$html_dirs .= str_repeat("\t",$niv + 2).'</ul>'."\n";
					$html_dirs .= str_repeat("\t",$niv + 1).'</li>'."\n";
				}
			}
		}
		closedir($handle);
		$html .= $html_dirs; // dossiers
		$html .= $html_fils; // fichiers
	}    
	if($niv == 0) { $html .= '	</ul>'."\n"; }
	return $html;
};
?>

appel à la fonction et mon formulaire d'insertion
if($action == 'list') {
	echo '<h1>'.$title.'</h1>';

	echo '<nav id="explorateur-dossier">';
	echo explore_dir_scan_html('/home/site/www/upload/albulle/data/photos/','http://www.monsite.fr/upload/albulle/data/photos/');
	echo '</nav>';

	echo dmaj("sais_photo.php");
	echo '</div></body></html>';
	exit;
}

	echo '<form method="post" name="foto" id="foto" action="'.$_SERVER["PHP_SELF"].'" onsubmit="return verif()" enctype="multipart/form-data">';
	echo '<h1>'.$title.'</h1>';
	
	echo '<table>';
	echo '<tr>';
	echo '<td class="libel">Date</td>';
	echo '<td class="data"><input type="text" name="datefoto" id="Saisfoto" size="25" value="'.$datefoto.'" class="oblig" /> jj /mm /aaaa</td>';
	echo '</tr><tr>';
	echo '<td class="libel">Ajouter Photos</td>';
	echo '<td class="data"><input type="file" name="namefoto[]" size="25" value="'.$fileName.'" accept="image/png, image/jpeg, image/gif" multiple="" class="oblig" /> ( max. 20 )</td>';
	echo '</tr><tr>';
	echo '<td class="libel">Lieu</td>';
	echo '<td class="data"><input type="text" name="lieufoto" size="25" value="'.$lieufoto.'" class="oblig" /></td>';
	echo '</tr>';
	echo '<td>';
		echo '<input type="hidden" name="haction" value="'.$action.'" />';
		echo '<input type="hidden" name="idfoto" value="'.$idfoto.'" />';
	echo '</td>';
	echo '<td class="data"><input type="submit" name="submit" value="'.$btsub.'" /></td>';
	echo '</tr>';
	echo '</table>';

	echo '</form>';
	echo '<p>NB: La saisie dans les zones à fond jaune pâle est obligatoire.</p>';
Messages postés
28938
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 juillet 2020
2 609
Nous montrer tout ton code n'a pas spécialement d'intéret...

Il nous faut :
- Le code du fichier supp_photo.php
- Un exemple de lien ( tu peux nous montrer le code d'un lien issue du code source GENERE de la page lorsque tu l'affiches ( pour avoir le code source en question, tu fais un CTRL + u une fois la page affichée dans ton navigateur ))
Messages postés
11512
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 juillet 2020
659
quel est le contenu de la page supp_photo.php?
si tu es absolument certain que seul un administrateur de confiance peut appeler cette page, le lien pourrait être:
supp_photo.php?fichier='.$dir.'/'.$entry
suggestion pour supp_photo.php:
$fichier = !empty($_GET['fichier']) ? $_GET['fichier'] : NULL;
if ($fichier) {
   if (unlink($fichier)) {
       echo "fichier supprimé: " . $fichier;
   }
   else {
       echo "fichier non supprimé: " . $fichier;
   }
else {
   echo "pas de fichier spécifié";
}
Messages postés
28938
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 juillet 2020
2 609
Pour l'url... si il y a des "/"' cela peut générer des soucis.
Pensez à faire des https://www.php.net/manual/fr/function.urlencode.php

En ce qui concerne la page de suppression...
Une vérification que le fichier existe avant de le supprimer est une bonne pratique (cela te permet de mettre un message indiquant qu'il n'a pas trouvé le fichier le cas échéant )
Penser également à vérifier le droit en écriture sur le dossier en question.

Toutes ces vérifications sont facilement faisables en php et la documentation se trouve simplement...
file_exists
is_writtable
...
Messages postés
407
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
6 février 2020
14
Bonjour,
Je vous remercie très sincèrement. Tout fonctionne à merveille.
Cordialement.