file_exists в PHP не работает должным образом

Для профиля пользователя на моем веб-сайте им разрешено загружать 1 изображение профиля. Это может быть PNG, JPG, JPEG или GIF. Теперь моя проблема заключается в отображении изображений. В принципе, я хотел бы посмотреть, какой у него тип расширения файла, а затем соответствующим образом отобразить файл. Я пытаюсь добиться этого с помощью функции file_exists в PHP, но она не работает! :(

Если я наберу URL-адрес (использует .png для примера)

http://localhost/postin'/profiles/pictures/username.png

в мою строку URL будет отображаться изображение этого пользователя. Затем, если я введу путь к файлу

C:/wamp/www/postin'/profiles/pictures/username.png

в адресную строку будет отображаться изображение этого пользователя. Теперь моя проблема заключается в том, что если я выполняю PHP file_check для любого из них, он всегда говорит, что файл НЕ существует. Вот код, который я использую:

<?php

$profileimagepath = "C:/wamp/www/postin'/profiles/pictures/";

$profileimageurl = "http://localhost/postin'/profiles/pictures/";

if (file_exists($profileimagepath.$username."."."png")) {   ?>
    <img src=<?php $profileimageurl.$username."."."png"; ?> id="accountpictureholderspecs">
<?php
}
elseif (file_exists($profileimagepath.$username."."."jpg")) {   ?>
    <img src=<?php $profileimageurl.$username."."."jpg"; ?> id="accountpictureholderspecs">
<?php
}
elseif (file_exists($profileimagepath.$username."."."jpeg")) {   ?>
    <img src=<?php $profileimageurl.$username."."."jpeg"; ?> id="accountpictureholderspecs">
<?php
}
elseif (file_exists($profileimagepath.$username."."."gif")) {   ?>
    <img src=<?php $profileimageurl.$username."."."gif"; ?> id="accountpictureholderspecs">
<?php
}
else {   ?>
    <img src="http://localhost/postin'/images/profileimage.png" id="accountpictureholderspecs">
<?php
}   
?>

А в приведенном выше примере username — это просто имя пользователя. Так что мне интересно, почему этот код не работает? Спасибо!! :)

EDIT Вот мой общий путь к файлу:

C:\wamp\www\postin'\profiles\pictures\image.png

Тем не менее, когда я набираю:

\pictures\image.png

Не получится, изображение не отображается! :( Кстати, моя структура каталогов:

Postin'
  Profiles
    Pictures
      image.png

person michael jones    schedule 05.03.2015    source источник
comment
почему у тебя апостроф в названии папки?   -  person MightyPork    schedule 06.03.2015
comment
Просто имя :) Я проверил его без апострофа, и он все еще не работает.   -  person michael jones    schedule 06.03.2015
comment
этот апостроф может сильно усложнить жизнь   -  person caramba    schedule 06.03.2015
comment
Как насчет .JPG, или .Jpg, или .jPg и т. д.? Почему вы объединяете две статические строки, такие как "."."jpg", вместо того, чтобы просто использовать ".jpg"? Почему вы не храните путь к изображению профиля пользователя в базе данных вместо того, чтобы полагаться на повторяющиеся и дорогостоящие операции ввода-вывода?   -  person Sammitch    schedule 06.03.2015
comment
В PHP $profileimagepath = "C:/wamp/www/postin'/profiles/pictures/"; никогда не может вернуть ваше изображение или любую другую папку. Представьте, PHP работает на вашем сервере (также если это виртуальный wamp-сервер), теперь он пытается найти (на сервере) путь с C:/wamp/www/po.., которого там просто нет... Как насчет того, чтобы попробовать что-то вроде этого: $files = glob($_SERVER["DOCUMENT_ROOT"]."/postin'/profiles/pictures/*"); var_dump($files); Теперь ваш $files должен что-то вернуть, если нет: var_dump($_SERVER['DOCUMENT_ROOT']); // что это возвращает?   -  person caramba    schedule 06.03.2015
comment
Я думаю, что одна из самых больших проблем заключается в том, что я никогда не смогу получить доступ к изображению по его путям.   -  person michael jones    schedule 07.03.2015


Ответы (2)


Из комментария php.net

При использовании file_exists кажется, что вы не можете сделать:

<?php 
foreach ($possibles as $poss) 
{ 
    if ( file_exists(SITE_RANGE_IMAGE_PATH .$this->range_id .'/ '.$poss .'.jpg') ) 
    { 
        // exists 
    } 
    else 
    { 
        // not found 
    } 
} 
?> 

поэтому вы должны сделать:

<?php 
foreach ($possibles as $poss) 
{ 
    $img = SITE_RANGE_IMAGE_PATH .$this->range_id .'/ '.$poss .'.jpg' 
    if ( file_exists($img) ) 
    { 
        // exists 
    } 
    else 
    { 
        // not found 
    } 
} 
?> 

Тогда дела пойдут нормально.

По крайней мере, так обстоит дело в этой системе Windows с php 5.2.5 и apache 2.2.3.

Не уверен, связано ли это с конкатенацией или с фактом, что там есть константа, я собираюсь убежать и проверить именно это...

person Leopold Stoch    schedule 05.03.2015

Что ж, если вы не знаете точного исключения - не используйте операторы if/else. Вы не можете охватить все возможные комбинации строчных и прописных букв.

Лично я бы рекомендовал конвертировать изображение в ВАШ любимый формат, когда пользователь загружает его, чтобы вы точно знали, что ищете!

Если это невозможно по каким-либо причинам, вы можете использовать glob() для поиска любого загруженного пользователем файла.

$profileimagepath = "C:/wamp/www/postin'/profiles/pictures/";
$profileimageurl = "http://localhost/postin'/profiles/pictures/";

$files = glob($profileimagepath . $username . ".*");

foreach($files AS $file){
  echo "Found an image: <br />";
  echo $file. "<br />";
  echo "External-Adress is: " . str_replace($profileimagepath, $profileimageurl, $file);
} 

Однако для этого потребуется иметь дело с несколькими файлами и ... нет ... Преобразовать, сохранить, использовать!

person dognose    schedule 05.03.2015
comment
Не плохо ли переключить тип изображения? - person michael jones; 07.03.2015
comment
@michaeljones это зависит от. JPG, например, ухудшит качество, если исходный файл не jpg. Я лично предпочитаю PNG для всех загруженных изображений, так как это формат сжатия без потерь, поэтому никто не может заметить разницу. Это может быть больше, но обычно дисковое пространство в настоящее время не является проблемой. поэтому для PHP вы всегда можете использовать такой метод: coderzone.org/library/. Фильтрация пользовательского ввода также гарантирует, что никто не сможет загружать большие файлы или файлы с неправильным разрешением и т. д. - person dognose; 07.03.2015