PHP: come verificare se il file immagine esiste?


98

Devo vedere se esiste un'immagine specifica sul mio cdn.

Ho provato quanto segue e non funziona:

if (file_exists(http://www.example.com/images/$filename)) {
    echo "The file exists";
} else {
    echo "The file does not exist";
}

Anche se l'immagine esiste o non esiste, dice sempre "Il file esiste". Non sono sicuro del motivo per cui non funziona ...


1
È necessario utilizzare il percorso completo del file nel file system del server (ad esempio "/home/you/public/img/sample.gif").
user9440008

Fai attenzione perché potresti scoprire che fare un file_existsin una posizione remota sarà molto lento.
crmpicco

Risposte:


130

Hai bisogno del nome del file almeno tra virgolette (come stringa):

if (file_exists('http://www.mydomain.com/images/'.$filename)) {
  }

Inoltre, assicurati che $filenamesia correttamente convalidato. E poi, funzionerà solo quando allow_url_fopenè attivato nella tua configurazione PHP


5
Sono stato in grado di farlo con successo usando @GetImageSize. Tuttavia, cosa richiederà meno server?
PaperChase

9
file_exists () deve utilizzare un percorso di file sul disco rigido, non un URL Questa risposta non è utile per me, non dovrebbe essere impostato come accettato.
Martin

Da PHP: bool file_exists (stringa $ nomefile) A partire da PHP 5.0.0, questa funzione può essere utilizzata anche con alcuni wrapper URL. Fare riferimento a Protocolli e wrapper supportati per determinare quali wrapper supportano la famiglia di funzionalità stat ().
Adrian P.

se $ filename string è null, file_exists restituirà true per la directory. Meglio usare is_file ($ filepath)
PodTech.io

1
Come dicevano le persone, non funziona su URL / percorsi remoti. Ma funziona in percorsi locali (percorso del server interno in cui si trovano i file). Inoltre, da altri metodi, il telecomando impiega fino a 14 secondi e il locale, meno di 1 secondo (per un certo esempio)
Rafa

110
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

Questo non ha funzionato per me. Il modo in cui l'ho fatto è stato usare getimagesize.

$src = 'http://www.mydomain.com/images/'.$filename;

if (@getimagesize($src)) {

Si noti che la "@" significherà che se l'immagine non esiste (nel qual caso la funzione di solito genera un errore getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failed:) restituirà false.


1
if (@getimagesize ($ src)) {fa miracoli, grazie, inoltre grazie per la spiegazione di @ qui
lesolorzanov

1
getimagesize () funziona, ma assicurati di includere il protocollo nell'URI (ad esempio, @getimagesize('//path/to/image.jpg')non funzionerà).
thdoan

file_exists o is_file non ha funzionato per me, questo ha funzionato. grazie!
Derk Jan Speelman

@getimagesize rallenterà notevolmente il caricamento della pagina. Non consigliato. is_file può essere usato invece e assicurati che $ src non sia l'URL completo: "http: // ..." ma "img / ..."
Bogdan C

is_file e file_exists non funzionano entrambi per le immagini, ma @getimagesize funziona bene.
Alam Zaib

14

Bene, file_existsnon dice se esiste un file, dice se esiste un percorso . ⚡⚡⚡⚡⚡⚡⚡

Quindi, per verificare se si tratta di un file, dovresti usarlo is_fileinsieme a file_existsper sapere se c'è davvero un file dietro il percorso, altrimenti file_existstornerà trueper qualsiasi percorso esistente.

Ecco la funzione che utilizzo:

function fileExists($filePath)
{
      return is_file($filePath) && file_exists($filePath);
}

2
Come può esserci un percorso esistente, ma il file non esiste, quando il percorso contiene il nome del file?
Andrew

1
Voglio dire che funziona anche se l'utente fornisce un percorso e non un file, la funzione restituirà true anche se non è un file amico mio.
Rizerzero

Differenziazione interessante e potenzialmente importante da fare. Ma se controlli i documenti, sembra che tu debba usare solo is_file per questo scopo, e non insieme a file_exists.
Andrew

ok fammi riassumere questo, (usa: PaperChase) vuole controllare se un file_esiste, il suo problema è che anche se dà un percorso alla funzione otterrà una vera risposta, quindi controlla chiaramente se esiste un file allora userebbe la mia funzione, perché la funzione php restituirebbe true anche se viene passato un percorso, quindi il nome della funzione è errato, dovrebbe essere Path_exists () e la mia funzione controlla davvero se esiste un file, perché restituirebbe false se viene passato qualcos'altro oltre a un percorso file esistente. spero che questo sia chiaro ora.
Rizerzero

Sì, avrebbe funzionato bene, ma secondo php.net/manual/en/function.is-file.php is_file () già controlla se il file / percorso esiste prima di verificare se si tratta di un file, quindi non dovrebbe essere necessario .
Andrew

13

Prova in questo modo:

$file = '/path/to/foo.txt'; // 'images/'.$file (physical path)

if (file_exists($file)) {
    echo "The file $file exists";
} else {
    echo "The file $file does not exist";
}

9

Ecco il modo più semplice per verificare se esiste un file:

if(is_file($filename)){
    return true; //the file exist
}else{
    return false; //the file does not exist
}

8

Una cosa che devi prima capire: non hai file .
Un file è un oggetto di un filesystem , ma stai facendo la tua richiesta usando il protocollo HTTP che non supporta file ma URL.

Quindi, devi richiedere un file inesistente utilizzando il tuo browser e vedere il codice di risposta. se non è 404, non puoi usare alcun wrapper per vedere se esiste un file e devi richiedere il tuo cdn usando qualche altro protocollo, ad esempio FTP


7
public static function is_file_url_exists($url) {
        if (@file_get_contents($url, 0, NULL, 0, 1)) {
            return 1;
        }

        return 0;           
    }

7

Se il file si trova nel tuo dominio locale, non è necessario inserire l'URL completo. Solo il percorso del file. Se il file si trova in una directory diversa, è necessario anteporre il percorso con "."

$file = './images/image.jpg';
if (file_exists($file)) {}

Spesso il "." viene lasciato disattivato, il che farà sì che il file venga mostrato come non esistente, quando in realtà lo fa.


3

C'è una grande differenza tra is_filee file_exists.

is_file restituisce true per i file (normali):

Restituisce TRUE se il nome del file esiste ed è un file normale, FALSE in caso contrario.

file_exists restituisce true sia per i file che per le directory:

Restituisce TRUE se il file o la directory specificata da filename esiste; FALSO altrimenti.


Nota: controlla anche questa domanda su stackoverflow per ulteriori informazioni su questo argomento.


2

Devi usare il percorso assoluto per vedere se il file esiste.

$abs_path = '/var/www/example.com/public_html/images/';
$file_url = 'http://www.example.com/images/' . $filename;

if (file_exists($abs_path . $filename)) {

    echo "The file exists. URL:" . $file_url;

} else {

    echo "The file does not exist";

}

Se stai scrivendo per CMS o PHP framework, per quanto ne so tutti hanno definito una costante per il percorso di root del documento.

Ad esempio, WordPress utilizza ABSPATH che può essere utilizzato globalmente per lavorare con i file sul server utilizzando il codice e l'URL del sito.

Esempio di Wordpress:

$image_path = ABSPATH . '/images/' . $filename;
$file_url = get_site_url() . '/images/' . $filename;

if (file_exists($image_path)) {

    echo "The file exists. URL:" . $file_url;

} else {

    echo "The file does not exist";

}

Sto facendo un ulteriore miglio qui :). Poiché questo codice non avrebbe bisogno di molta manutenzione e abbastanza solido, lo scriverei con un'istruzione if abbreviata:

$image_path = ABSPATH . '/images/' . $filename;
$file_url = get_site_url() . '/images/' . $filename;

echo (file_exists($image_path))?'The file exists. URL:' . $file_url:'The file does not exist';

Spiegazione dell'istruzione IF abbreviata:

$stringVariable = ($trueOrFalseComaprison > 0)?'String if true':'String if false';

2

puoi usare cURL. Puoi fare in modo che cURL ti dia solo le intestazioni e non il corpo, il che potrebbe renderlo più veloce. Un dominio errato potrebbe sempre richiedere del tempo perché dovrai attendere il timeout della richiesta; probabilmente potresti cambiare la durata del timeout usando cURL.

Ecco un esempio:

function remoteFileExists($url) {
$curl = curl_init($url);

//don't fetch the actual page, you only want to check the connection is ok
curl_setopt($curl, CURLOPT_NOBODY, true);

//do request
$result = curl_exec($curl);

$ret = false;

//if request did not fail
if ($result !== false) {
    //if request was ok, check response code
    $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

    if ($statusCode == 200) {
        $ret = true;   
    }
}

curl_close($curl);

return $ret;
}
$exists = remoteFileExists('http://stackoverflow.com/favicon.ico');
if ($exists) {
echo 'file exists';
} else {
   echo 'file does not exist';   
}


1

Se stai usando curl, puoi provare il seguente script:

function checkRemoteFile($url)
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL,$url);
 // don't download content
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(curl_exec($ch)!==FALSE)
{
    return true;
}
else
{
    return false;
}

}

URL di riferimento: https://hungred.com/how-to/php-check-remote-email-url-image-link-exist/


1
ho bisogno di un timeout qui
Mike Q

1

prova questo :

if (file_exists(FCPATH . 'uploads/pages/' . $image)) {
    unlink(FCPATH . 'uploads/pages/' . $image);
}

1

Se il percorso della tua immagine è relativo alla radice dell'applicazione, è meglio usare qualcosa del genere:

function imgExists($path) {
    $serverPath = $_SERVER['DOCUMENT_ROOT'] . $path;

    return is_file($serverPath)
        && file_exists($serverPath);
}

Esempio di utilizzo per questa funzione:

$path = '/tmp/teacher_photos/1546595125-IMG_14112018_160116_0.png';

$exists = imgExists($path);

if ($exists) {
    var_dump('Image exists. Do something...');
}

Penso che sia una buona idea creare qualcosa come la libreria per verificare l'esistenza dell'immagine applicabile a diverse situazioni. Sopra molte ottime risposte che puoi usare per risolvere questo compito.


0

Leggi i primi 5 byte da HTTP usando fopen()e fread()poi usa questo:

DEFINE("GIF_START","GIF");
DEFINE("PNG_START",pack("C",0x89)."PNG");
DEFINE("JPG_START",pack("CCCCCC",0xFF,0xD8,0xFF,0xE0,0x00,0x10)); 

per rilevare l'immagine.


potrebbe esserci un'immagine 404 generica
Il tuo buon senso

2
Sì, quindi l'immagine esiste sull'URL specificato.
Peter

0

file_existslegge non solo file, ma anche percorsi. quindi quando $filenameè vuoto, il comando verrà eseguito come se fosse scritto in questo modo:

file_exists("http://www.example.com/images/")

se la directory / images / esiste, la funzione tornerà comunque true.

Di solito lo scrivo così:

// !empty($filename) is to prevent an error when the variable is not defined
if (!empty($filename) && file_exists("http://www.example.com/images/$filename"))
{
    // do something
}
else
{
    // do other things
}

0

file_exists($filepath) restituirà un risultato vero per una directory e un percorso file completo, quindi non è sempre una soluzione quando non viene passato un nome di file.

is_file($filepath) restituirà true solo per percorsi di file completi


0

hai bisogno del percorso del server con file_exists

per esempio

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }

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.