PHP: Wie überprüfe ich, ob eine Bilddatei existiert?

97

Ich muss sehen, ob ein bestimmtes Bild auf meiner CD vorhanden ist.

Ich habe Folgendes versucht und es funktioniert nicht:

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

Selbst wenn das Bild existiert oder nicht existiert, heißt es immer "Die Datei existiert". Ich bin mir nicht sicher, warum es nicht funktioniert ...

Schnitzeljagd
quelle
1
Sie sollten den vollständigen Pfad zur Datei in Ihrem Server-Dateisystem verwenden (z. B. '/home/you/public/img/sample.gif').
user9440008
Seien Sie vorsichtig damit, da es möglicherweise file_existssehr langsam ist, einen Remote-Standort zu erreichen.
Crmpicco

Antworten:

130

Sie benötigen den Dateinamen mindestens in Anführungszeichen (als Zeichenfolge):

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

Stellen Sie außerdem sicher, dass $filenamees ordnungsgemäß validiert ist. Und dann funktioniert es nur, wenn allow_url_fopenes in Ihrer PHP-Konfiguration aktiviert ist

stricken
quelle
5
Ich konnte es erfolgreich mit @GetImageSize machen. Was wird jedoch weniger serverintensiv sein?
PaperChase
9
file_exists () muss einen Dateipfad auf der Festplatte verwenden, keine URL. Dies ist keine nützliche Antwort für mich und sollte nicht als akzeptiert festgelegt werden.
Martin
Von PHP: bool file_exists (Zeichenfolge $ filename) Ab PHP 5.0.0 kann diese Funktion auch mit einigen URL-Wrappern verwendet werden. Unter Unterstützte Protokolle und Wrapper finden Sie Informationen darüber, welche Wrapper die stat () - Funktionsfamilie unterstützen.
Adrian P.
Wenn $ filename string null ist, gibt file_exists true für das Verzeichnis zurück. Besser zu verwenden is_file ($ filepath)
PodTech.io
1
Wie gesagt, funktioniert es nicht auf Remote-URLs / Pfaden. Es funktioniert jedoch in lokalen Pfaden (interner Serverpfad, in dem sich Dateien befinden). Bei anderen Methoden dauert die Fernbedienung bis zu 14 Sekunden und die lokale Fernbedienung weniger als 1 Sekunde (für ein bestimmtes Beispiel)
Rafa,
110
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

Das hat bei mir nicht funktioniert. So wie ich es gemacht habe, habe ich getimagesize verwendet.

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

if (@getimagesize($src)) {

Beachten Sie, dass das '@' bedeutet, dass wenn das Bild nicht existiert (in diesem Fall würde die Funktion normalerweise einen Fehler getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failedauslösen :), false zurückgegeben wird.

Jeffrey Jenkinson
quelle
1
if (@getimagesize ($ src)) {wirkt Wunder, danke, zusätzlich danke für die Erklärung von @ hier
lesolorzanov

1
getimagesize () funktioniert, aber stellen Sie sicher, dass Sie das Protokoll in den URI aufnehmen (z. B. @getimagesize('//path/to/image.jpg')nicht).
Donnerstag,

file_exists oder is_file hat bei mir nicht funktioniert, das hat funktioniert. Danke!
Derk Jan Speelman

@getimagesize verlangsamt das Laden der Seite erheblich. Nicht empfohlen. is_file kann stattdessen verwendet werden und stellt sicher, dass $ src nicht die vollständige URL ist: "http: // ..." sondern "img / ..."
Bogdan C

is_file und file_exists funktionieren beide nicht für Bilder, aber @getimagesize funktioniert einwandfrei.
Alam Zaib

14

Nun, file_existssagt nicht, ob eine Datei existiert, sondern ob ein Pfad existiert . ⚡⚡⚡⚡⚡⚡⚡

Um zu überprüfen, ob es sich um eine Datei handelt, sollten Sie is_filezusammen mit verwenden, file_existsum festzustellen, ob sich tatsächlich eine Datei hinter dem Pfad befindet. Andernfalls file_existswird truefür einen vorhandenen Pfad zurückgegeben.

Hier ist die Funktion, die ich benutze:

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

2
Wie könnte ein Pfad vorhanden sein, aber die Datei nicht vorhanden, wenn der Pfad den Dateinamen enthält?
Andrew

1
Ich meine, dass es sogar funktioniert, wenn der Benutzer einen Pfad und keine Datei angibt. Die Funktion würde true zurückgeben, auch wenn es keine Datei ist, mein Freund.
Rizerzero

Interessante und möglicherweise wichtige Differenzierung. Wenn Sie jedoch die Dokumente überprüfen, müssen Sie anscheinend nur is_file für diesen Zweck verwenden und nicht in Verbindung mit file_exists.
Andrew

OK, lassen Sie mich das zusammenfassen. (Verwenden Sie: PaperChase) Sie möchten überprüfen, ob eine Datei vorhanden ist. Sein Problem ist, dass er selbst dann eine echte Antwort erhält, wenn er einen Pfad zur Funktion angibt, um zu überprüfen, ob dann eine Datei vorhanden ist er würde meine Funktion verwenden, da die PHP-Funktion true zurückgeben würde, selbst wenn ein Pfad übergeben wird, so dass der Funktionsname schlecht ist, es sollte Path_exists () sein und meine Funktion prüft wirklich, ob eine Datei existiert, da sie false zurückgeben würde, wenn Alles andere als ein vorhandener Dateipfad wird übergeben. Ich hoffe, das ist jetzt klar.
Rizerzero

Ja, es würde gut funktionieren, aber laut php.net/manual/en/function.is-file.php prüft is_file () bereits, ob der Pfad / die Datei vorhanden ist, bevor geprüft wird, ob es sich um eine Datei handelt .
Andrew

13

Versuchen Sie es so:

$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

Hier ist der einfachste Weg, um zu überprüfen, ob eine Datei vorhanden ist:

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

8

Eine Sache, die Sie zuerst verstehen müssen: Sie haben keine Dateien .
Eine Datei ist Gegenstand eines Dateisystems , aber Sie stellen Ihre Anfrage über das HTTP-Protokoll, das keine Dateien, sondern URLs unterstützt.

Sie müssen also eine nicht vorhandene Datei mit Ihrem Browser anfordern und den Antwortcode anzeigen. Wenn es nicht 404 ist, können Sie keine Wrapper verwenden, um festzustellen, ob eine Datei vorhanden ist, und Sie müssen Ihre CDN über ein anderes Protokoll anfordern, z. B. FTP


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

        return 0;           
    }

7

Wenn sich die Datei in Ihrer lokalen Domain befindet, müssen Sie nicht die vollständige URL eingeben. Nur der Pfad zur Datei. Wenn sich die Datei in einem anderen Verzeichnis befindet, müssen Sie dem Pfad "."

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

Oftmals das "." wird weggelassen, wodurch die Datei als nicht vorhanden angezeigt wird, obwohl dies tatsächlich der Fall ist.


3

Es gibt einen großen Unterschied zwischen is_fileund file_exists.

is_file Gibt true für (reguläre) Dateien zurück:

Gibt TRUE zurück, wenn der Dateiname vorhanden ist und eine reguläre Datei ist, andernfalls FALSE .

file_exists Gibt sowohl für Dateien als auch für Verzeichnisse true zurück:

Gibt TRUE zurück, wenn die durch den Dateinamen angegebene Datei oder das Verzeichnis vorhanden ist. Andernfalls FALSCH .


Hinweis: Weitere Informationen zu diesem Thema finden Sie auch in dieser Frage zum Stapelüberlauf .


2

Sie müssen den absoluten Pfad verwenden, um festzustellen, ob die Datei vorhanden ist.

$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";

}

Wenn Sie für ein CMS- oder PHP-Framework schreiben, haben meines Wissens alle eine Konstante für den Dokumentstammpfad definiert.

Beispielsweise verwendet WordPress ABSPATH, das global für die Arbeit mit Dateien auf dem Server unter Verwendung Ihres Codes sowie der Site-URL verwendet werden kann.

WordPress-Beispiel:

$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";

}

Ich gehe hier eine Extrameile :). Da dieser Code nicht viel Wartung benötigt und ziemlich solide ist, würde ich ihn als Abkürzung für if schreiben:

$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';

Kurzschrift IF-Erklärung erklärt:

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

2

Sie können cURL verwenden. Sie können cURL dazu bringen, nur die Überschriften und nicht den Text anzugeben, wodurch es möglicherweise schneller wird. Eine fehlerhafte Domain kann immer eine Weile dauern, da Sie auf das Zeitlimit für die Anforderung warten. Sie könnten wahrscheinlich die Timeout-Länge mit cURL ändern.

Hier ist ein Beispiel:

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

Wenn Sie Curl verwenden, können Sie das folgende Skript ausprobieren:

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;
}

}}

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

Yogi Ghorecha
1
brauche eine Auszeit hier
Mike Q
Es könnte ein generisches 404-Bild geben
Your Common Sense
2
Ja - das Bild ist also unter der angegebenen URL vorhanden.
Peter
1

Versuche dies :

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

Wenn der Pfad zu Ihrem Image relativ zum Anwendungsstamm ist, ist es besser, Folgendes zu verwenden:

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

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

Anwendungsbeispiel für diese Funktion:

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

$exists = imgExists($path);

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

Ich denke, es ist eine gute Idee, so etwas wie eine Bibliothek zu erstellen, um die Bildexistenz zu überprüfen, die für verschiedene Situationen anwendbar ist. Oben finden Sie viele gute Antworten, mit denen Sie diese Aufgabe lösen können.

B. Bohdan
quelle
0

Lesen Sie die ersten 5 Bytes von HTTP mit fopen()und verwenden Sie fread()dann Folgendes:

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

Bild zu erkennen.

Peter
quelle
Es könnte ein generisches 404-Bild geben
Your Common Sense
2
Ja - das Bild ist also unter der angegebenen URL vorhanden.
Peter
0

file_existsliest nicht nur Dateien, sondern auch Pfade. Wenn $filenameder Befehl leer ist, wird er so ausgeführt, als ob er wie folgt geschrieben wäre:

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

Wenn das Verzeichnis / images / vorhanden ist, wird die Funktion weiterhin zurückgegeben true.

Normalerweise schreibe ich es so:

// !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
}
Dapidmini
quelle
0

file_exists($filepath) gibt ein echtes Ergebnis für ein Verzeichnis und einen vollständigen Dateipfad zurück, ist also nicht immer eine Lösung, wenn ein Dateiname nicht übergeben wird.

is_file($filepath) gibt nur true für vollständige Dateipfade zurück

PodTech.io
quelle
0

Sie benötigen einen Serverpfad mit file_exists

beispielsweise

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }
Altravista
quelle
0
if(@getimagesize($image_path)){
 ...}

Arbeitet für mich.

Sicherer Ahmed
quelle