Gestion de fichiers dans un répertoire

Résolu
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 20 déc. 2023 à 15:00
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 21 déc. 2023 à 17:42

Bonjour à toutes et à tous,

Je souhaite avoir dans un répertoire sous la racine, un fichier pour gérer les fichiers d'un autre répertoire également sous la racine.La gestion consisterait à lister les fichiers (uniquement les fichiers et pas . et ..) puis avoir pour chacun des fichier un lien hypertexte qui permette de le télécharger et pour finir, avoir un bouton qui permette d'effacer ou pas le fichier en question.

J'ai actuellement ce code :

<?php
echo 'test<br>';   // simple vérification
    $scandir = scandir("../uploads");
    foreach($scandir as $fichiers){
    $documents = array($fichiers);
        //affiche chaque document avec un lien pour le télécharger et un bouton pour supprimer le fichier
        echo '<html>
                <form method="POST" id="gest-doc" class="princ-form">
                <a href="../uploads/'.$fichiers.'">'.$fichiers.'</a>
                &emsp;
                <input style="font-size : 12px;" type="submit" name="btnSubmit" id="submit" class="gest-doc" value="Supprimer"/>
                </form>
            </html>
        ';
        // si le bouton supprimer est actionné
        if(isset($_POST['btnSubmit'])){
        // supprime le fichier
        $delfile=('../uploads/'.$fichiers);
        echo $delfile;   // juste pour vérifier le chemin
        unlink($delfile);
        }
        echo '<br>';
    }
?>

Ce code fonctionne bien mais avec des loupés...

1°) il m'affiche . et .. avec

$documents = array($fichiers);

car je n'arrive pas à le remplacer par

$documents = array_diff($fichiers, array('.', '..'));

2°) le foreach et le unlink() fonctionne très bien, voire trop bien car il me supprime tous les fichiers lorsque l'on clique sur n'importe quel bouton ;-( ... Est-ce qu'en passant par une msgbox qui apparaitrait après avoir cliqué sur le lien pour le téléchargement et demandant la suppression du fichier oui/non éviterait cela ? En utilisant du javascript pour cela, je pense.

A moins qu'une solution plus propre soit faisable mais là, je sèche un peu.

Merci d'avance au contributeur ou à la contributrice qui éclairera ma lanterne.
Et bonnes fêtes à tous et à toutes.

Daniel


Windows / Firefox 120.0

A voir également:

1 réponse

Bonjour,

Essaye la fonction php glob à la place de scandir pour lister les fichiers (glob ne retourne pas les dossiers spéciaux . et ..) : https://www.php.net/manual/fr/function.glob.php

Ajoute un attribut download sur ton lien de téléchargement : https://www.w3schools.com/tags/att_a_download.asp

Pour supprimer uniquement le fichier cliqué, il faut transmettre via un paramètre get ou post l'identifiant unique du fichier (son nom par exemple).

Attention à bien vérifier dans ton code que le fichier à supprimer correspond bien aux fichiers du dossier upload.
Si tu ne fais pas de vérification, l'utilisateur pourrait supprimer d'autres fichiers de ton serveur.
 

1
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
21 déc. 2023 à 12:20

Bonjour Pitet,

Merci pour la function glob.

J'ai aussi mis l'attribut download (pour moi, c'était évident qui si cela s'affichait à l'écran et que je voulais en garder une copie, il suffisait d'un clic droit sur le lien et enregistrer... mais bon, c'est mis).

Pour la suppression, il y a bien le post du bouton submit, et ça fonctionne pour le fichier identifié avec $fichiers mais je pense que le fait qu'il soit dans la boucle foreach, cela ne s'arrête pas au fichier à côté du bouton mais continue la boucle jusqu'à ce que tous les fichiers aient été effacés du coup.
Si je sors le bouton de la boucle, je n'aurai qu'un seul bouton sur toute la page l'utilisateur ne saura pas clairement ce qu'il supprime. D'où peut-être la piste d'un msgbox qui après avoir cliqué sur un lien pour télécharger demanderait s'il faut supprimer le fichier.
Je vais creuser encore cette partie mais merci en tout cas pour le glob et le conseil du download.
Bonnes fêtes de fin d'année
Daniel

 

0
Pitet > danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024
21 déc. 2023 à 12:33

Le msgbox ne pourra pas résoudre ce problème.
L'affichage des boutons supprimer doit se faire dans la boucle pour avoir un bouton supprimer pour chaque fichier (avec un paramètre unique pour chaque bouton).

La suppression du fichier lorsque l'utilisateur clique sur un bouton ne doit pas être fait dans la boucle mais dès le début du script, en récupérant le paramètre unique transmis par le bouton/formulaire pour supprimer uniquement le fichier spécifié.

0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2 > Pitet
21 déc. 2023 à 14:56

L'affichage des boutons supprimer doit se faire dans la boucle pour avoir un bouton supprimer pour chaque fichier (avec un paramètre unique pour chaque bouton) ???
Je vois bien de quoi il est question mais je suis totalement incapable d'écrire cela.
Je ne sais pas combien de bouton il faudra créer donc un for ... to... n'est pas utilisable.
Je vais aller fouiller la littérature sur le comptage d'un array.
 

0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2 > Pitet
21 déc. 2023 à 15:25

Effectivement $nb=count(array); fonctionne très bien.

Reste à jouer avec le JS pour donner des noms à mes boutons.

0
Pitet > danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024
21 déc. 2023 à 16:32

Le JS n'est pas nécessaire, un exemple simple (avec un paramètre get au lieu d'un formulaire post) :

<?php

if (!empty($_GET['filename'])) {
    if (!file_exists('../uploads/' . basename($_GET['filename']))) {
        echo 'Fichier inexistant';
    } else {
        unlink('../uploads/' . basename($_GET['filename']));
        echo 'Fichier supprimé';
    }
}

$files = glob('../uploads/*');

foreach ($files as $file) {
    $filename = basename($file);

    echo 'Fichier : ' . htmlspecialchars($filename) . '<br>';
    echo '<a download href="../uploads/' . urlencode($filename). '">Télécharger</a><br>';
    echo '<a href="?filename=' . urlencode($filename). '">Supprimer</a><br>';
}
1