Come eliminare un file tramite PHP?


174

Come posso eliminare un file dal mio server con PHP se il file si trova in un'altra directory?

Ecco il mio layout di pagina:

  • projects/backend/removeProjectData.php (questo file elimina tutte le mie voci per il database e dovrebbe anche eliminare il file correlato)
  • public_files/22.pdf (il luogo in cui si trova il file.)

Sto usando la unlinkfunzione:

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

Ma questo mi dà sempre un errore che il file non esiste. Qualche idea?


2
<pre> Usa il percorso assoluto </pre>
Pavunkumar

1
se non si controlla usando il percorso reale, è probabile che si ottenga il "." e ".." anche non file, causando errori nel file
DrogoNevets

1
Ma attenzione, questo potrebbe non eliminare davvero il tuo file se il tuo file ha più nomi / collegamenti simbolici! Vedere questa discussione per ulteriori informazioni: stackoverflow.com/q/17548906/1114320
Sliq

Risposte:


229

Quanto segue dovrebbe aiutare

  • realpath - Restituisce il percorso assoluto canonicalizzato
  • is_writable - Indica se il nome file è scrivibile
  • unlink - Elimina un file

Esegui il percorso del file attraverso realpath, quindi controlla se il percorso restituito è scrivibile e, in tal caso, scollegalo.


7
Mi chiedo come stia facendo w3shools? w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr

3
@Gordon mi dispiace .. ho usato il termine sbagliato che fa una grande differenza .. Sono d'accordo che era idiota .. ma quello che ho cercato di dire è un esempio di codifica sarebbe più utile .. se dovessi visitare altri tre link per capire la tua risposta è molto utile? ..scusa ancora per la parola sbagliata .. non vengo dal paese di lingua inglese ... anche se non può essere una scusa ...
Ritabrata Gautam

13
@RitabrataGautam "se devo visitare altri tre link per capire la tua risposta è molto utile?" - Sì. Perché dopo aver visitato i link avrai capito come funziona. Se ti do solo i codici, non capirai, ma solo copia e incolla. Cosa hai imparato allora? Niente. Inoltre, il codice è molto banale.
Gordon,

1
@Gordon .. sono d'accordo .. le tue opinioni richiedono rispetto .. hai guadagnato # 185K .. solo due domande veloci ... 1> se considero la tua risposta completa, allora perché molti moderatori qui dicono che dovresti fornire anche un codice ... non solo collegamenti (causa molti voti negativi) ... 2> non sarebbe meglio se si inserisse un codice. ora chi ha la tendenza all'apprendimento visiterà sicuramente quei link e chi non lo farà andrà di nuovo su google per ottenere un codice pronto.
Ritabrata Gautam,

2
la risposta mi è sembrata abbastanza semplice: ma l'esempio di codice che volevi: $ 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
votato per aver utilizzato la file_existsfunzione. Altrimenti riceverai un errore se il file non esiste.
Mahdi

17

Controlla le tue autorizzazioni prima di tutto sul file, per assicurarti di poterlo a) vederlo dal tuo script eb) essere in grado di eliminarlo.

Puoi anche utilizzare un percorso calcolato dalla directory in cui stai eseguendo lo script, ad esempio:

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

(in PHP 5.3 credo che tu possa usare la __DIR__costante invece di dirname()ma non l'ho ancora usata da sola)


Ho controllato i permessi e all'inizio non sono stato in grado di vedere il file, ma ora tutto funziona grazie a realpath. grazie per il consiglio
Ken

7

Puoi eliminare il file usando

unlink($Your_file_path);

ma se stai eliminando un file dal suo percorso http, questo scollegamento non funziona correttamente. Devi dare un percorso di file corretto.


4

Soluzione AIO, gestisce tutto, non è il mio lavoro ma mi sono appena migliorato. Godere!

/**
 * 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);
}

sembra perfetto, grazie mille ma per favore aggiornalo poiché non puoi usare unlinkcome nome per la tua funzione.
Reham Fahmy

Se è una funzione statica pubblica in una classe, unlink è un nome di funzione valido: 3v4l.org/MgA2l
nadar

Sì, ma nello scenario attuale, Standalone è una scelta migliore.
Junaid Atari,

1

So che questa domanda è un po 'vecchia, ma questa è una cosa semplice che funziona molto bene per me per eliminare le immagini dal mio progetto a cui sto lavorando.

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

La dirname(__FILE__)sezione stampa il percorso di base del tuo progetto. L' /img/tasks/sono due cartelle giù dal mio percorso di base. E infine, c'è la mia immagine che voglio eliminare che puoi trasformare in tutto ciò di cui hai bisogno.

Con questo non ho avuto alcun problema ad accedere ai miei file sul mio server ed eliminarli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.