PHP: как проверить, существует ли файл изображения?


99

Мне нужно увидеть, существует ли конкретное изображение на моем компакт-диске.

Я пробовал следующее, и это не работает:

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 03

Будьте осторожны с этим, так как вы можете обнаружить, что выполнение операции 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-адрес. Для меня это бесполезный ответ, не следует указывать его как принятый.
Martin

Из PHP: bool file_exists (string $ filename) Начиная с PHP 5.0.0, эту функцию также можно использовать с некоторыми оболочками URL. Обратитесь к разделу Поддерживаемые протоколы и оболочки, чтобы определить, какие оболочки поддерживают семейство функций stat ().
Адриан П.

если строка $ filename имеет значение null, то file_exists вернет значение true для каталога. Лучше использовать 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она вернет false.


1
if (@getimagesize ($ src)) {творит чудеса, спасибо, дополнительно спасибо за объяснение @ здесь
lesolorzanov

1
getimagesize () работает, но убедитесь, что вы включили протокол в URI (например, @getimagesize('//path/to/image.jpg')не будет работать).
thdoan

file_exists или is_file у меня не работали, это сработало. Спасибо!
Дерк Ян

@getimagesize резко замедлит загрузку страницы. Не рекомендуется. Вместо этого можно использовать is_file и убедиться, что $ src - это не полный url: "http: // ...", а "img / ..."
Богдан С.

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
Я имею в виду, что это работает, даже если пользователь указывает путь, а не файл, функция вернет истину, даже если это не файл, мой друг.
Rizerzero

Интересное и потенциально важное различие. Но если вы посмотрите документацию, похоже, что вам нужно использовать только is_file для этой цели, а не вместе с file_exists.
Эндрю

хорошо, позвольте мне подвести итог вам, (используйте: PaperChase) хочет проверить, существует ли file_exists, его проблема в том, что даже если он укажет путь к функции, он получит истинный ответ, поэтому, чтобы четко проверить, существует ли файл, тогда он будет использовать My function, потому что функция php вернет true, даже если путь будет передан, поэтому имя функции плохое, оно должно быть Path_exists (), а My function действительно проверяет, существует ли файл, потому что он вернет false, если передается что-либо, кроме существующего пути к файлу. Я надеюсь, что теперь это ясно.
Rizerzero 01

Да, это будет работать нормально, но согласно 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 возвращает true как для файлов, так и для каталогов:

Возвращает TRUE, если файл или каталог, указанный в filename, существует; ЛОЖЬ в противном случае.


Примечание: проверьте также этот вопрос о переполнении стека для получения дополнительной информации по этой теме.


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

}

Я делаю здесь лишнюю милю :). Поскольку этот код не требует особого обслуживания и довольно надежен, я бы написал его как сокращенное выражение 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';

Краткое объяснение оператора 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
здесь нужен тайм-аут
Майк Кью

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
Your Common Sense

2
Да - значит изображение существует по указанному URL.
Питер

0

file_existsчитает не только файлы, но и пути. поэтому, когда $filenameон пуст, команда будет работать так, как если бы она написана так:

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

если каталог / 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) вернет истину только для полных путей к файлам



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.