PHP: Jak sprawdzić, czy plik obrazu istnieje?

98

Muszę sprawdzić, czy na moim CDN istnieje określony obraz.

Próbowałem następujących rzeczy i to nie działa:

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

Nawet jeśli obraz istnieje lub nie istnieje, zawsze mówi „Plik istnieje”. Nie wiem, dlaczego to nie działa ...

PaperChase
źródło
1
Powinieneś użyć pełnej ścieżki do pliku w systemie plików serwera (np. „/Home/you/public/img/sample.gif”).
user9440008
Zachowaj ostrożność, ponieważ może się okazać, że wykonanie operacji file_existsw odległej lokalizacji będzie bardzo powolne.
crmpicco,

Odpowiedzi:

130

Potrzebujesz nazwy pliku przynajmniej w cudzysłowie (jako ciąg znaków):

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

Upewnij się również, że $filenamejest prawidłowo zweryfikowany. A potem będzie działać tylko wtedy, gdy allow_url_fopenjest aktywowany w konfiguracji PHP

knittl
źródło
5
Udało mi się to zrobić z powodzeniem przy użyciu @GetImageSize. Co jednak będzie mniej obciążające serwer?
PaperChase
9
file_exists () musi używać ścieżki do pliku na dysku twardym, a nie adresu URL. Ta odpowiedź nie jest dla mnie przydatna, nie powinna być ustawiona jako zaakceptowana.
Martin
Z PHP: bool file_exists (string $ filename) Od PHP 5.0.0 ta funkcja może być również używana z niektórymi opakowaniami URL. Zobacz Obsługiwane protokoły i opakowania, aby określić, które opakowania obsługują rodzinę funkcji stat ().
Adrian P.,
jeśli ciąg $ filename ma wartość null, wówczas file_exists zwróci wartość true dla katalogu. Lepiej używać is_file ($ filepath)
PodTech.io
1
Jak mówią ludzie, nie działa na zdalnych adresach URL / ścieżkach. Ale działa w ścieżkach lokalnych (wewnętrzna ścieżka serwera, na której znajdują się pliki). Ponadto, z innych metod, zdalne zajmuje nawet 14 sekund, a lokalne mniej niż 1 sekundę (na przykład)
Rafa
110
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

To nie zadziałało dla mnie. Sposób, w jaki to zrobiłem, to użycie getimagesize.

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

if (@getimagesize($src)) {

Zauważ, że '@' będzie oznaczać, że jeśli obraz nie istnieje (w takim przypadku funkcja zwykle zwróci błąd getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failed:), zwróci false.

Jeffrey Jenkinson
źródło
1
if (@getimagesize ($ src)) {działa cuda, dziękuję, dodatkowo dziękuję za wyjaśnienie @ tutaj
lesolorzanov

1
getimagesize () działa, ale upewnij się, że dołączasz protokół do URI (np. @getimagesize('//path/to/image.jpg')nie zadziała).
thdoan

file_exists lub is_file nie działały dla mnie, to zadziałało. Dziękuję Ci!
Derk Jan Speelman

@getimagesize radykalnie spowolni ładowanie strony. Niepolecane. Zamiast tego można użyć is_file i upewnij się, że $ src nie jest pełnym adresem URL: „http: // ...”, ale „img / ...”
Bogdan C

is_file i file_exists nie działają dla obrazów, ale @getimagesize działa dobrze.
Alam Zaib

14

Cóż, file_existsnie mówi, czy istnieje plik, ale mówi, czy istnieje ścieżka . ⚡⚡⚡⚡⚡⚡⚡

Tak więc, aby sprawdzić, czy jest to plik, powinieneś używać is_filerazem z, file_existsaby wiedzieć, czy za ścieżką naprawdę znajduje się plik, w przeciwnym razie file_existszwróci truekażdą istniejącą ścieżkę.

Oto funkcja, której używam:

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

2
W jaki sposób ścieżka może istnieć, ale plik nie istnieje, jeśli ścieżka zawiera nazwę pliku?
Andrew

1
mam na myśli, że to działa nawet, jeśli użytkownik poda ścieżkę, a nie plik, funkcja zwróci prawdę, nawet jeśli nie jest to plik mój przyjacielu.
Rizerzero

Ciekawe i potencjalnie ważne zróżnicowanie do zrobienia. Ale jeśli sprawdzisz dokumenty, wygląda na to, że do tego celu potrzebujesz tylko is_file, a nie w połączeniu z file_exists.
Andrew

ok, pozwól mi podsumować to do ciebie, (użyj: PaperChase) chce sprawdzić, czy plik_istnieje, jego problemem jest to, że nawet jeśli poda ścieżkę do funkcji, otrzyma prawdziwą odpowiedź, więc aby wyraźnie sprawdzić, czy plik istnieje, to użyłby funkcji My, ponieważ funkcja php zwróciłaby prawdę, nawet jeśli ścieżka została przekazana, więc nazwa funkcji jest zła, powinna to być Path_exists (), a Moja funkcja Naprawdę sprawdza, czy plik istnieje, ponieważ zwróciłby fałsz, jeśli przekazywana jest cokolwiek innego niż istniejąca ścieżka do pliku. mam nadzieję, że teraz jest to jasne.
Rizerzero

Tak, działałoby dobrze, ale zgodnie z php.net/manual/en/function.is-file.php is_file () już sprawdza, czy ścieżka / plik istnieje przed sprawdzeniem, czy jest to plik, więc nie powinieneś tego robić .
Andrew

13

Spróbuj tak:

$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

Oto najprostszy sposób sprawdzenia, czy plik istnieje:

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

8

Najpierw musisz zrozumieć: nie masz plików .
Plik jest przedmiotem systemu plików , ale wykonujesz żądanie przy użyciu protokołu HTTP, który nie obsługuje plików, ale adresy URL.

Musisz więc zażądać nieistniejącego pliku za pomocą przeglądarki i zobaczyć kod odpowiedzi. jeśli nie jest to 404, nie możesz użyć żadnych opakowań, aby sprawdzić, czy plik istnieje i musisz zażądać cdn za pomocą innego protokołu, na przykład FTP


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

        return 0;           
    }

7

Jeśli plik znajduje się w Twojej domenie lokalnej, nie musisz wpisywać pełnego adresu URL. Tylko ścieżka do pliku. Jeśli plik znajduje się w innym katalogu, musisz poprzedzić ścieżkę znakiem „.”

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

Często „.” zostanie pominięty, co spowoduje, że plik zostanie pokazany jako nieistniejący, podczas gdy w rzeczywistości tak jest.


3

Istnieje zasadnicza różnica między is_filei file_exists.

is_file zwraca prawdę dla (zwykłych) plików:

Zwraca TRUE, jeśli nazwa pliku istnieje i jest zwykłym plikiem, FALSE w przeciwnym razie.

file_exists zwraca prawdę dla plików i katalogów:

Zwraca TRUE, jeśli plik lub katalog określony przez filename istnieje; FAŁSZ inaczej.


Uwaga: sprawdź również to pytanie dotyczące przepełnienia stosu, aby uzyskać więcej informacji na ten temat.


2

Musisz użyć ścieżki bezwzględnej, aby sprawdzić, czy plik istnieje.

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

}

Jeśli piszesz dla CMS lub frameworka PHP, to o ile wiem, wszystkie mają zdefiniowaną stałą dla ścieżki głównej dokumentu.

np. WordPress używa ABSPATH, który może być używany globalnie do pracy z plikami na serwerze przy użyciu Twojego kodu, jak również adresu URL witryny.

Przykład 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";

}

Idę o krok dalej :). Ponieważ ten kod nie wymagałby wiele konserwacji i byłby całkiem solidny, napisałbym go jako skróconą instrukcję if:

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

Skrócona instrukcja IF wyjaśniła:

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

2

możesz użyć cURL. Możesz ustawić cURL tak, aby podawał tylko nagłówki, a nie treść, co może przyspieszyć działanie. Zła domena może zawsze zająć trochę czasu, ponieważ będziesz czekać na przekroczenie limitu czasu żądania; prawdopodobnie możesz zmienić długość limitu czasu za pomocą cURL.

Oto przykład:

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

Jeśli używasz curl, możesz wypróbować następujący skrypt:

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

}

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

Yogi Ghorecha
1
potrzebuję czasu tutaj
Mike Q
może być ogólny obraz 404
Your Common Sense
2
Tak - więc obraz istnieje pod określonym adresem URL.
Peter
1

Spróbuj tego :

if (file_exists(FCPATH . 'uploads/pages/' . $image)) {
    unlink(FCPATH . 'uploads/pages/' . $image);
}
Dev_meno
źródło
1

Jeśli ścieżka do twojego obrazu jest względna w stosunku do katalogu głównego aplikacji, lepiej użyć czegoś takiego:

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

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

Przykład użycia tej funkcji:

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

$exists = imgExists($path);

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

Myślę, że dobrym pomysłem jest stworzenie czegoś w rodzaju biblioteki, aby sprawdzić istnienie obrazu mającego zastosowanie w różnych sytuacjach. Powyżej wiele świetnych odpowiedzi, których możesz użyć do rozwiązania tego zadania.

B. Bohdan
źródło
0

Przeczytaj pierwsze 5 bajtów z HTTP używając, fopen()a fread()następnie użyj tego:

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

do wykrywania obrazu.

Piotr
źródło
może być ogólny obraz 404
Your Common Sense
2
Tak - więc obraz istnieje pod określonym adresem URL.
Peter
0

file_existsczyta nie tylko pliki, ale także ścieżki. więc gdy $filenamejest puste, polecenie działałoby tak, jakby było napisane w ten sposób:

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

jeśli katalog / obrazy / istnieje, funkcja nadal zwróci true.

Zwykle piszę to tak:

// !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
źródło
0

file_exists($filepath) zwróci prawdziwy wynik dla katalogu i pełnej ścieżki pliku, więc nie zawsze jest rozwiązaniem, gdy nie podano nazwy pliku.

is_file($filepath) zwróci true tylko dla pełnych ścieżek plików

PodTech.io
źródło
0

potrzebujesz ścieżki serwera z file_exists

na przykład

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }
Altravista
źródło
0
if(@getimagesize($image_path)){
 ...}

Pracuje dla mnie.

Bezpieczniejszy Ahmed
źródło