Убедитесь, что кодировка файловой системы совпадает с кодировкой строки, содержащей имя файла в вашем коде PHP.
В противном случае вы проверяете, существует ли неправильный файл.
Например, если ваша файловая система не поддерживает UTF-8, но имя файла закодировано в UTF-8.
Edit:
Итак, вы прокомментировали, что имя файла в UTF-8, и вы используете windows.
Именно об этом и был мой ответ. Как написано здесь :
Плохие новости для пользователей Windows: файловые системы Windows (FAT, FAT32, NTFS) не поддерживают UTF-8. Имена файлов кодируются в ISO-8859-1 или CP437 / CP850 / (или в соответствии с вашим языком) в зависимости от файловой системы и локализации. Поэтому вы, вероятно, столкнетесь с проблемами, пытаясь сопоставить имена файлов из базы данных и файловой системы, если будете следовать этому руководству. (Хотя я никогда не пробовал.)
Обходной путь Windows: современные версии Windows поддерживают UTF-8 на смонтированных общих ресурсах. Создайте общий доступ к своей медиа-папке и подключите ее как сетевой диск.
Поэтому создайте общий ресурс или закодируйте имя файла в кодировке, которая фактически работает с вашей файловой системой. Это не ошибка в PHP. Вы просто не проверяете правильное имя файла, вот и все.
Edit2:
Предполагая, что у вас есть NTFS, которая может принимать UTF-16 (что не совсем точно AFAIK, но вы можете попробовать), вы можете преобразовать имя файла UTF-8 в имя-имя UTF-16. :
$name = mb_convert_encoding($name, 'UTF-16', 'UTF-8');
А затем попробуйте, если file_exists работает. Имейте в виду, что он может быть технически неверным, и у вас может иметь дополнительную проблему с кодировкой, которая мешает вам правильно использовать даже эту перекодировку.
Связано: В какой кодировке хранятся имена файлов в NTFS?