PHP: Як перевірити, чи існує файл зображення?


97

Мені потрібно перевірити, чи існує конкретний образ на моєму CDD.

Я спробував таке, і це не працює:

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

Навіть якщо зображення існує або не існує, воно завжди говорить "Файл існує". Я не впевнений, чому це не працює ...


1
Ви повинні використовувати повний шлях до файлу у вашій файловій системі сервера (наприклад, '/home/you/public/img/sample.gif').
user9440008

Будьте обережні з цим, оскільки, можливо, виявиться, що робити file_existsвіддалене місце буде дуже повільно.
crmpicco

Відповіді:


130

Ім'я файлу вам потрібно хоча б у лапках (як рядок):

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

Також переконайтесь, що $filenameце правильно підтверджено. І тоді він працюватиме лише тоді, коли allow_url_fopenактивовано у вашому конфігурації PHP


5
Мені вдалося це зробити успішно за допомогою @GetImageSize. Однак, що буде менш інтенсивним на сервері?
PaperChase

9
file_exists () повинен використовувати шлях до файлу на жорсткому диску, а не URL. Для мене це не корисна відповідь, не слід встановлювати як прийняте.
Мартін

Від PHP: bool file_exists (рядок $ filename) Станом на PHP 5.0.0, ця функція також може використовуватися з деякими обгортками URL-адрес. Перегляньте Підтримувані протоколи та обгортки, щоб визначити, які обгортки підтримують сімейство функцій stat ().
Адріан П.

якщо рядок $ filename є нульовою, то file_exists поверне вірно для каталогу. Краще використовувати is_file ($ filepath)
PodTech.io

1
Як кажуть люди, він не працює на віддалених URL-адресах / шляхах. Але він працює в локальних контурах (внутрішній шлях до сервера, де розташовані файли). Крім того, з інших методів віддалений займає до 14 секунд, а локальний - менше 1 секунди (для певного прикладу)
Рафа,

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

Це не спрацювало для мене. Як я це робив, використовував getimagesize.

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

if (@getimagesize($src)) {

Зауважте, що "@" означатиме, що якщо зображення не існує (у такому випадку функція зазвичай getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failedвидасть помилку:), він поверне помилкове значення.


1
якщо (@getimagesize ($ src)) {творить чудеса, дякую, додатково дякую за пояснення @ тут
lesolorzanov

1
getimagesize () працює, але переконайтеся, що ви включили протокол в URI (наприклад, @getimagesize('//path/to/image.jpg')не буде працювати).
Thoan

file_exists або is_file для мене не працював, це було. спасибі!
Дерк Ян Шпельман

@getimagesize різко уповільнить завантаження сторінки. Не рекомендовано. is_file можна використовувати замість цього і переконайтесь, що $ src не є повною URL-адресою: "http: // ...", але "img / ..."
Богдан C

is_file і file_exists обидва не працюють для зображень, але @getimagesize працює нормально.
Алам Зайб

14

Ну, file_existsне говорить, якщо файл існує, він говорить, якщо існує шлях . ⚡⚡⚡⚡⚡⚡⚡

Отже, щоб перевірити, чи це файл, тоді вам слід скористатися is_fileразом, file_existsщоб знати, чи дійсно є файл за шляхом, інакше file_existsповернеться trueдо будь-якого існуючого шляху.

Ось функція, яку я використовую:

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

2
Як може існувати шлях, який існує, але файл не існує, коли шлях містить ім'я файлу?
Андрій

1
я маю на увазі, що це навіть працює, якщо користувач дає шлях, а не файл, функція поверне справжнє, навіть якщо це не мій друг.
Різерцеро

Цікава та потенційно важлива диференціація. Але якщо ви перевірите документи, схоже, вам потрібно використовувати для цього лише is_file, а не спільно з file_exists.
Андрій

ОК, дозвольте підсумувати це вам, (використання: PaperChase) хоче перевірити, чи існує файл_ієкс, його проблема полягає в тому, що навіть якщо він дає шлях до функції, він отримає справжню відповідь, щоб чітко перевірити, чи файл існує тоді він би використовував Мою функцію, тому що функція php повертає справжнє, навіть якщо шлях буде пропущений, тому ім'я функції погано, воно повинно бути Path_exists (), а моя функція дійсно перевіряє, чи існує файл, тому що він поверне помилкове, якщо проходить нічого іншого, ніж існуючий шлях до файлу. Я сподіваюся, що це зараз ясно
Різерцеро

Так, це буде добре, але згідно з php.net/manual/en/function.is-file.php is_file () вже перевіряє, чи існує шлях / файл, перш ніж перевіряти, чи це файл, тому вам не потрібно буде .
Андрій

13

Спробуйте так:

$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

Ось найпростіший спосіб перевірити наявність файлу:

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

8

Що потрібно зрозуміти спочатку: у вас немає файлів .
Файл є предметом файлової системи , але ви робите запит, використовуючи протокол HTTP, який підтримує не файли, а URL-адреси.

Отже, вам потрібно подати запит на існуючий файл за допомогою свого браузера та переглянути код відповіді. якщо це не 404, ви не можете використовувати будь-які обгортки, щоб побачити, чи існує файл, і вам потрібно буде подати запит на свій cdn, використовуючи якийсь інший протокол, наприклад FTP


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

        return 0;           
    }

7

Якщо файл знаходиться у вашому локальному домені, вам не потрібно вводити повну URL-адресу. Тільки шлях до файлу. Якщо файл перебуває в іншому каталозі, вам потрібно попередньо встановити шлях з ".

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

Часто буває "". Залишилося, що призведе до того, що файл буде показаний як неіснуючий, якщо він насправді є.


3

Існує велика різниця між is_fileта file_exists.

is_file повертає true для (звичайних) файлів:

Повертає TRUE, якщо ім'я файлу існує та є звичайним файлом, FALSE в іншому випадку.

file_exists повертає вірно і для файлів, і для каталогів:

Повертає ІСТИНА, якщо файл або каталог, вказані іменем файлу, існують; ЛАЖУТЬ інакше.


Примітка. Перевірте також це запитання щодо поточного потоку для отримання додаткової інформації щодо цієї теми.


2

Ви повинні використовувати абсолютний шлях, щоб побачити, чи існує файл.

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

}

Якщо ви пишете для CMS або PHP Framework, то, наскільки я знаю, усі вони визначають константу для кореневого шляху документа.

наприклад, WordPress використовує ABSPATH, який можна використовувати в усьому світі для роботи з файлами на сервері, використовуючи ваш код, а також URL-адресу сайту.

Приклад 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";

}

Я проходжу тут зайву милю :). Оскільки цей код не потребує великого обслуговування та досить міцний, я б написав його як скорочення, якщо заява:

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

Стенограма IF пояснює:

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

2

ви можете використовувати CURL. Ви можете отримати CURL, щоб дати вам лише заголовки, а не тіло, що може зробити це швидше. Неправильний домен завжди може зайняти деякий час, тому що ви будете чекати запиту на тайм-аут; ви могли, ймовірно, змінити довжину часу очікування за допомогою CURL.

Ось приклад:

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

Якщо ви використовуєте curl, ви можете спробувати наступний сценарій:

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-адреса: https://hungred.com/how-to/php-check-remote-email-url-image-link-exist/


1
потрібен тайм-аут тут
Майк Q

1

спробуйте це :

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

1

Якщо шлях до вашого зображення відносно кореня програми, краще використовувати щось подібне:

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

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

Приклад використання цієї функції:

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

$exists = imgExists($path);

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

Я думаю, що добре б створити щось на зразок бібліотеки, щоб перевірити наявність зображень, застосовних для різних ситуацій. Вище багато чудових відповідей, які ви можете використовувати для вирішення цього завдання.


0

Прочитайте спочатку 5 байт форми HTTP, fopen()а fread()потім скористайтеся цим:

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

для виявлення зображення.


може бути загальне зображення 404
Ваше здорове чуття

2
Так - так зображення існує за вказаною URL-адресою.
Петро

0

file_existsчитає не тільки файли, але й шляхи. тому, коли $filenameпорожній, команда запускатиметься так, ніби написана так:

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

якщо каталог / образи / існує, функція все одно повернеться true.

Я зазвичай пишу так:

// !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) поверне справжній результат для каталогу та повного шляху, тому не завжди це рішення, коли ім'я файлу не передано.

is_file($filepath) поверне вірно лише для повністю прокладених файлів


0

вам потрібен шлях до сервера з file_exists

наприклад

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.