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

99

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

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

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

Даже если изображение существует или не существует, всегда отображается сообщение «Файл существует». Я не уверен, почему это не работает ...

PaperChase
источник
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";
}
Pinaldesai
источник
9

Вот самый простой способ проверить, существует ли файл:

if(is_file($filename)){
    return true; //the file exist
}else{
    return false; //the file does not exist
}
Jfindley
источник
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;           
    }
realmag777
источник
7

Если файл находится в вашем локальном домене, вам не нужно указывать полный URL. Только путь к файлу. Если файл находится в другом каталоге, вам нужно указать путь перед знаком "."

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

Часто "." не указывается, что приведет к отображению файла как несуществующего, хотя на самом деле это так.

master_gracey
источник
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';   
}
маникюр1706
источник
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);
}
Dev_meno
источник
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
}
dapidmini
источник
0

file_exists($filepath) вернет истинный результат для каталога и полного пути к файлу, поэтому это не всегда решение, если имя файла не передано.

is_file($filepath) вернет истину только для полных путей к файлам

PodTech.io
источник
0

вам нужен путь к серверу с file_exists

например

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }
Альтрависта
источник
0
if(@getimagesize($image_path)){
 ...}

У меня работает.

Сейфер Ахмед
источник