2011-02-04 1 views
0

이미지 경로를 취하고 끝에 텍스트를 추가 한 다음 다시 결합하는 함수를 작성했습니다. 이미지에 새 텍스트를 추가 한 후 파일이 있는지 테스트하려면 if else 브랜치를 작성하려고합니다. I는 화상 경로를 요청할 경우, 예를 들어파일이 있는지 확인하십시오. 원본 경로로 돌아 가기

는 :

http://example.com/image1.jpg 

그것은 이것에 수정 될 수있다 :

함수가 워드를 대상
http://example.com/image1-150x100.jpg 

때문에 $ 포스트> 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"와 같은 절대 경로를 취할 수 있습니까? 아니면 '/path/to/file/image1.jpg'와 같은 루트 스타일 절대 경로 만 허용합니까?

답변

3

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

내가 아는 한 file_exists()은 로컬 파일 시스템의 파일 또는 디렉토리가 종료되는지 확인 만합니다. fsockopen()을 통해 다른 서버에 연결 한 다음 HTTP-Code를 확인하여 파일이 있는지 확인하십시오.

// 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); 
+1

HTTP 헤더 요청 (ayush에서 사용)은 GET을 사용하는 것보다 낫습니다. HEAD 요청은 헤더 만 반환하며 서버는 이미지 자체를 보내려고하지 않습니다. – UnkwnTech

+1

젠장,이 기본 HTTP 물건조차 모르겠다. 나는 RFC를 한 번 읽어야한다. 주의 해 주셔서 감사합니다. – anroesti

+0

@ayush에는 좋은 대답이 있다고 생각하지만 적어도 아무도 upvote에 신경을 쓰지 않는다고 생각하는 적어도 2 명의 사람들이있다. 유일한 upvote 내입니다 ;-) – jeroen

0

(3210)은 같은 것을 할 수있는 프로 시저의 첫 번째 부분보다 컴팩트 만들려면 :

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

다음 원격 서버에있는 파일을 확인 @ayush에서 게시 기능을 사용을

0
if(@getimagesize($imghttppath)) 
{ 
    echo '<img src="'. $imghttppath . '" />'; 
} 
else 
{ 
    echo '<img src="http://www.domain.com/images/default.jpg" />'; 
} 

그것은 getimagesize의 다소 정통적인 사용이며, 파일이 존재하지 않으면 오류를 반환하기 때문에 오류를 끄지 않는 한 @이어야합니다. 그러나 얻을 수있는만큼 간단합니다. 외부 URL, 로컬 URL, 로컬 절대 경로 및 작업 디렉토리에 대한 상대 경로를 사용하여 이미지 존재 여부와 실제 이미지인지 확인합니다.