Comment supprimer un fichier via PHP?


174

Comment supprimer un fichier de mon serveur avec PHP si le fichier se trouve dans un autre répertoire?

Voici ma mise en page:

  • projects/backend/removeProjectData.php (ce fichier supprime toutes mes entrées pour la base de données et devrait également supprimer le fichier associé)
  • public_files/22.pdf (l'endroit où se trouve le fichier.)

J'utilise la unlinkfonction:

unlink('../../public_files/' . $fileName);

Mais cela me donne toujours une erreur selon laquelle le fichier n'existe pas. Des idées?


2
<pre> Utiliser le chemin absolu </pre>
Pavunkumar

1
si vous ne vérifiez pas en utilisant un chemin réel, vous obtiendrez probablement le "." et ".." non-fichiers aussi, provoquant des erreurs de fichier n'existe pas
DrogoNevets

1
Mais attention, cela pourrait ne pas vraiment supprimer votre fichier si votre fichier a plusieurs noms de fichiers / liens symboliques! Voir ce fil pour plus d'informations: stackoverflow.com/q/17548906/1114320
Sliq

Réponses:


229

Ce qui suit devrait aider

  • realpath - Renvoie le chemin absolu canonisé
  • is_writable - Indique si le nom de fichier est accessible en écriture
  • unlink - Supprime un fichier

Exécutez votre chemin de fichier via realpath, puis vérifiez si le chemin renvoyé est accessible en écriture et, le cas échéant, dissociez-le.


7
Je me demande comment w3shools fait cela? w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr

3
@Gordon, je suis désolé .. j'ai utilisé le terme incorrect, ce qui fait une grande différence .. je suis d'accord que c'était idiot .. mais ce que j'ai essayé de dire est un exemple de codage serait plus utile .. si je dois visiter trois autres liens pour comprendre votre réponse est-ce très utile? ..désolé encore pour le mauvais mot .. je ne suis pas de pays anglophone ... même si cela ne peut pas être une excuse ...
Ritabrata Gautam

13
@RitabrataGautam "si j'ai besoin de visiter trois autres liens pour comprendre votre réponse, est-ce très utile?" - Oui, ça l'est. Parce qu'après avoir consulté les liens, vous aurez compris comment cela fonctionne. Si je vous donne juste les codes, vous ne comprendrez pas mais copiez et collez. Qu'as-tu appris alors? Rien. De plus, le code pour cela est très simple.
Gordon le

1
@Gordon .. je suis d'accord .. vos opinions exigent le respect .. vous l'avez mérité # 185K .. juste deux questions rapides ... 1> si je considère votre réponse comme complète, alors pourquoi de nombreux modérateurs disent que vous devriez également fournir du code ... pas seulement des liens (cela cause de nombreux votes négatifs) ... 2> ce ne serait pas mieux si vous mettez du code. maintenant, qui a tendance à apprendre, ils visiteront sûrement ces liens et qui ne l'ont pas, ils iront à nouveau sur Google pour obtenir un code prêt.
Ritabrata Gautam

2
la réponse me semblait assez simple: mais l'exemple de code que vous vouliez: $ path = realpath ('../../ public_files /'. $ fileName); if (is_writable ($ path)) {unlink ($ path);}
me_

103
$files = [
    './first.jpg',
    './second.jpg',
    './third.jpg'
];

foreach ($files as $file) {
    if (file_exists($file)) {
        unlink($file);
    } else {
        // File not found.
    }
}

11
voté pour l'utilisation de la file_existsfonction. Sinon, vous obtiendrez une erreur si le fichier n'existe pas.
Mahdi

17

Vérifiez d'abord vos autorisations sur le fichier, pour vous assurer que vous pouvez a) le voir à partir de votre script, et b) pouvoir le supprimer.

Vous pouvez également utiliser un chemin calculé à partir du répertoire dans lequel vous exécutez actuellement le script, par exemple:

unlink(dirname(__FILE__) . "/../../public_files/" . $filename);

(en PHP 5.3, je pense que vous pouvez utiliser la __DIR__constante au lieu de dirname()mais je ne l'ai pas encore utilisée moi-même)


J'ai vérifié les permissions et je n'ai pas pu voir le fichier au début mais maintenant tout fonctionne grâce au realpath. merci pour les conseils
Ken

7

Vous pouvez supprimer le fichier en utilisant

unlink($Your_file_path);

mais si vous supprimez un fichier de son chemin http, cette dissociation ne fonctionne pas correctement. Vous devez donner un chemin de fichier correct.


4

Solution AIO, gère tout, ce n'est pas mon travail mais je me suis juste amélioré. Prendre plaisir!

/**
 * Unlink a file, which handles symlinks.
 * @see https://github.com/luyadev/luya/blob/master/core/helpers/FileHelper.php
 * @param string $filename The file path to the file to delete.
 * @return boolean Whether the file has been removed or not.
 */
function unlinkFile ( $filename ) {
    // try to force symlinks
    if ( is_link ($filename) ) {
        $sym = @readlink ($filename);
        if ( $sym ) {
            return is_writable ($filename) && @unlink ($filename);
        }
    }

    // try to use real path
    if ( realpath ($filename) && realpath ($filename) !== $filename ) {
        return is_writable ($filename) && @unlink (realpath ($filename));
    }

    // default unlink
    return is_writable ($filename) && @unlink ($filename);
}

semble parfait, merci beaucoup mais veuillez le mettre à jour car vous ne pouvez pas utiliser unlinkcomme nom pour votre fonction.
Reham Fahmy

Si c'est une fonction publique statique dans une classe, un lien est un nom de fonction valide: 3v4l.org/MgA2l
nadar

Ouais, mais dans le scénario actuel, Standalone est un meilleur choix.
Junaid Atari

1

Je sais que cette question est un peu ancienne, mais c'est quelque chose de simple qui fonctionne très bien pour moi pour supprimer les images de mon projet sur lequel je travaille.

unlink(dirname(__FILE__) . "/img/tasks/" . 'image.jpg');

La dirname(__FILE__)section imprime le chemin de base de votre projet. Il /img/tasks/y a deux dossiers en dessous de mon chemin de base. Et enfin, il y a mon image que je veux supprimer que vous pouvez transformer en tout ce dont vous avez besoin.

Avec cela, je n'ai eu aucun problème pour accéder à mes fichiers sur mon serveur et les supprimer.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.