Jak usunąć plik przez PHP?

174

Jak usunąć plik z mojego serwera za pomocą PHP, jeśli plik znajduje się w innym katalogu?

Oto mój układ strony:

  • projects/backend/removeProjectData.php (ten plik usuwa wszystkie moje wpisy w bazie danych i powinien również usunąć powiązany plik)
  • public_files/22.pdf (miejsce, w którym znajduje się plik).

Używam unlinkfunkcji:

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

Ale to zawsze daje mi błąd, że plik nie istnieje. Jakieś pomysły?

Rozpoznać
źródło
2
<pre> Użyj ścieżki bezwzględnej </pre>
Pavunkumar
1
jeśli nie sprawdzisz, używając prawdziwej ścieżki, prawdopodobnie otrzymasz znak „.” i „..” inne niż pliki, powodując błędy pliku nie istnieje
DrogoNevets,
1
Ale uwaga, to może nie usunąć twojego pliku, jeśli twój plik ma wiele nazw plików / dowiązań symbolicznych! Zobacz ten wątek, aby uzyskać więcej informacji: stackoverflow.com/q/17548906/1114320
Sliq.

Odpowiedzi:

228

Poniższe informacje powinny pomóc

  • realpath - Zwraca kanonizowaną bezwzględną nazwę ścieżki
  • is_writable - Informuje, czy nazwa pliku jest zapisywalna
  • unlink - usuwa plik

Uruchom ścieżkę do pliku przez realpath, a następnie sprawdź, czy zwrócona ścieżka jest zapisywalna, a jeśli tak, odłącz ją.

Gordon
źródło
7
Zastanawiam się, jak w3shools to robi? w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr
3
@Gordon, przepraszam. Użyłem niewłaściwego terminu, co robi dużą różnicę .. zgadzam się, że to było idiotyczne .. ale próbowałem powiedzieć, że przykład kodowania byłby bardziej pomocny .. jeśli muszę odwiedzić trzy inne linki aby zrozumieć Twoją odpowiedź, czy jest ona bardzo pomocna? ..sorry ponownie za niewłaściwe słowo .. nie jestem z angielskiego kraju mówiącej ... chociaż to nie może być wymówką ...
Ritabrata Gautam
13
@RitabrataGautam "Jeśli muszę odwiedzić trzy inne linki, aby zrozumieć Twoją odpowiedź, czy jest to bardzo pomocne?" - Tak to jest. Ponieważ po przejściu do linków zrozumiesz, jak to działa. Jeśli podam Ci kody, nie zrozumiesz, tylko skopiuj i wklej. Czego się wtedy nauczyłeś? Nic. Poza tym kod do tego jest bardzo trywialny.
Gordon
1
@Gordon… zgadzam się… Twoje poglądy wymagają szacunku… zasłużyłeś na to # 185 tys.… Tylko dwa krótkie pytania… 1> jeśli uważam, że Twoja odpowiedź jest kompletna, to dlaczego wielu moderatorów mówi, że powinieneś również podać kod ... nie tylko linki (powoduje to wiele głosów negatywnych) ... 2> czy nie byłoby lepiej, gdybyś wstawił jakiś kod. teraz, kto ma skłonność do uczenia się, na pewno odwiedzi te linki, a kto tego nie ma, ponownie przejdzie do Google po gotowy kod.
Ritabrata Gautam
2
odpowiedź wydawała mi się dość prosta: ale przykładowy kod, który chciałeś: $ path = realpath ('../../ public_files /'. $ fileName); if (is_writable ($ path)) {unlink ($ path);}
me_,
102
$files = [
    './first.jpg',
    './second.jpg',
    './third.jpg'
];

foreach ($files as $file) {
    if (file_exists($file)) {
        unlink($file);
    } else {
        // File not found.
    }
}
UbiQue
źródło
11
głosowało za użyciem file_existsfunkcji. W przeciwnym razie pojawi się błąd, jeśli plik nie istnieje.
Mahdi
17

Najpierw sprawdź swoje uprawnienia do pliku, aby upewnić się, że a) widzisz go w swoim skrypcie i b) możesz go usunąć.

Możesz również użyć ścieżki obliczonej na podstawie katalogu, w którym aktualnie uruchamiasz skrypt, np .:

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

(w PHP 5.3 myślę, że możesz użyć __DIR__stałej zamiast, dirname()ale ja jeszcze jej nie używałem)

bogata
źródło
Sprawdziłem uprawnienia i początkowo nie mogłem zobaczyć pliku, ale teraz wszystko działa dzięki realpath. dzięki za radę
Ken
7

Możesz usunąć plik za pomocą

unlink($Your_file_path);

ale jeśli usuwasz plik z jego ścieżki http, to odłączenie nie działa poprawnie. Musisz podać poprawną ścieżkę do pliku.

ankit suthar
źródło
4

Rozwiązanie AIO, obsługuje wszystko, to nie moja praca, ale po prostu się poprawiłem. Cieszyć się!

/**
 * 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);
}
Junaid Atari
źródło
wygląda idealnie, wielkie dzięki, ale zaktualizuj go, ponieważ nie możesz używać unlinkjako nazwy funkcji.
Reham Fahmy
Jeśli jest to publiczna funkcja statyczna w klasie, unlink jest prawidłową nazwą funkcji: 3v4l.org/MgA2l
nadar
Tak, ale w obecnym scenariuszu Standalone jest lepszym wyborem.
Junaid Atari
1

Wiem, że to pytanie jest trochę stare, ale jest to coś prostego, które bardzo dobrze sprawdza się przy usuwaniu obrazów z mojego projektu, nad którym pracuję.

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

dirname(__FILE__)Sekcja wypisuje ścieżkę bazową do projektu. /img/tasks/Są dwa foldery w dół z mojego ścieżki bazowej. I wreszcie mój obraz, który chcę usunąć, i który możesz przekształcić w wszystko, czego potrzebujesz.

Dzięki temu nie miałem żadnego problemu z dostaniem się do moich plików na serwerze i ich usunięciem.

abetwothree
źródło