Найти, если файл существует, если нет, вернуться к исходному пути - PullRequest
0 голосов
/ 04 февраля 2011

Я написал функцию, чтобы взять путь к изображению, добавить немного текста в конец, а затем соединить его вместе. Я пытаюсь написать ветку if else, чтобы проверить, существует ли файл после добавления нового текста к изображению.

Например, если я запрашиваю путь к изображению:

http://example.com/image1.jpg

Это можно изменить следующим образом:

http://example.com/image1-150x100.jpg

Функция предназначена для WordPress, поэтому принимает аргумент $ post-> ID, имя настраиваемого поля, ширину и высоту предполагаемой цели.

Вот функция:

function get_galleria_image ( $post_id, $customFieldName, $width, $height ) {

    $imagePath = get_post_meta($post_id, $customFieldName, true);

    $splitImage = explode('.', $imagePath);

    $count = count($splitImage);

    $firstHalf =  array_slice($splitImage, 0, $count-1);

    $secondHalf = array_slice($splitImage, $count-1);

    $secondHalf[0] = '-' . $width . 'x' . $height . '.' . $secondHalf[0];

    $firstHalfJoined = implode('.', $firstHalf);

    $completedString = $firstHalfJoined . $secondHalf[0];

    // if the filename with the joined string does not exist, return the original image
    if (file_exists($completedString)){
        return $completedString;
    } else {
        return $imagePath;
    }
}

Я знаю, что это грубо, поэтому приветствуются любые идеи по сжатию этого кода и его улучшению. Я обнаружил, что функция всегда возвращает исходный путь к изображению. Может ли file_exists () принимать абсолютный путь, например "http://example.com/image1.jpg',", или он принимает только абсолютный путь в стиле root, например '/path/to/file/image1.jpg'?

Ответы [ 4 ]

3 голосов
/ 04 февраля 2011

file_exists не принимает путь URL.Попробуйте это для URL-пути к , проверьте, является ли данный URL изображением или нет

function isImage($url)
  {
     $params = array('http' => array(
                  'method' => 'HEAD'
               ));
     $ctx = stream_context_create($params);
     $fp = @fopen($url, 'rb', false, $ctx);
     if (!$fp) 
        return false;  // Problem with url

    $meta = stream_get_meta_data($fp);
    if ($meta === false)
    {
        fclose($fp);
        return false;  // Problem reading data from url
    }

    $wrapper_data = $meta["wrapper_data"];
    if(is_array($wrapper_data)){
      foreach(array_keys($wrapper_data) as $hh){
          if (substr($wrapper_data[$hh], 0, 19) == "Content-Type: image") // strlen("Content-Type: image") == 19 
          {
            fclose($fp);
            return true;
          }
      }
    }

    fclose($fp);
    return false;
  }
2 голосов
/ 04 февраля 2011

Насколько я знаю, file_exists() проверяет только выход файла или каталога в локальной файловой системе. Вы можете подключиться к другому серверу через fsockopen(), а затем проверить HTTP-код, чтобы узнать, существует ли файл.

// you will need to set $host and $file

$sock = fsockopen ( $host );
fwrite ( $sock, "HEAD ".$image." HTTP/1.1\r\n" );
fwrite ( $sock, "Host: ".$file."\r\n" );
fwrite ( $sock, "Connection: close\r\n\r\n" );

// Get the first twelve characters of the response - enough to check the response code
if ( fgets ( $sock, 12 ) == "HTTP/1.1 404" )
    //file doesn't exist
else
    //file exists

fclose ( $sock );
0 голосов
/ 04 февраля 2011
if(@getimagesize($imghttppath))
{
     echo '<img src="'. $imghttppath . '" />';
}
else
{
     echo '<img src="http://www.domain.com/images/default.jpg" />';
}

Это своего рода неортодоксальное использование getimagesize, и оно должно быть @, если вы не отключаете ошибки, потому что он возвращает ошибку, если файл не существует. Но это так просто, как вы можете получить. Работает с внешними URL-адресами, локальными URL-адресами, локальными абсолютными путями и относительными путями к рабочему каталогу, чтобы проверить, существует ли изображение и является ли оно действительным.

0 голосов
/ 04 февраля 2011

чтобы сделать более компактную первую часть вашей процедуры, вы можете сделать что-то вроде:

$completedString = preg_replace("/(.+)\.([^.]+)$/siU", "$1" . "-" . $width ."x" . $height . "$2", $splitImage);

затем используйте функцию, отправленную @ayush, чтобы проверить файл на удаленном сервере

...