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

Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
- - Dernière réponse : LaChaux78
Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
- 24 juil. 2019 à 13:48
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>';
Afficher la suite 

10 réponses

Messages postés
8285
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412
0
Merci
bonjour, quel est l'obstacle à la mise en place la fonction "unlink" pour la suppression?
Commenter la réponse de yg_be
Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
1
0
Merci
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.
yg_be
Messages postés
8285
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412 -
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.
Commenter la réponse de LaChaux78
Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
1
0
Merci
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é.
yg_be
Messages postés
8285
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412 -
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?
Commenter la réponse de LaChaux78
Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
1
0
Merci
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...
yg_be
Messages postés
8285
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412 -
tu n'as pas répondu à ma question en #3.
Commenter la réponse de LaChaux78
Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
1
0
Merci
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.
jordane45
Messages postés
26101
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 août 2019
1753 -
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.
Commenter la réponse de LaChaux78
Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
1
0
Merci
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";
yg_be
Messages postés
8285
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412 -
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
Commenter la réponse de LaChaux78
Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
1
0
Merci
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.
yg_be
Messages postés
8285
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412 -
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.
Commenter la réponse de LaChaux78
Messages postés
26101
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 août 2019
1753
0
Merci
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...

Commenter la réponse de jordane45
Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
1
0
Merci
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>';
jordane45
Messages postés
26101
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 août 2019
1753 -
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 ))
yg_be
Messages postés
8285
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 août 2019
412 -
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é";
}
jordane45
Messages postés
26101
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 août 2019
1753 -
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
...
Commenter la réponse de LaChaux78
Messages postés
362
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 juillet 2019
1
0
Merci
Bonjour,
Je vous remercie très sincèrement. Tout fonctionne à merveille.
Cordialement.
Commenter la réponse de LaChaux78