2009-09-01 4 views
14
내가 getimagesize($img)를하려고하는데

이미지가 존재하지 않으면 오류가 발생합니다. 파일이 존재하는지 여부를 먼저 확인하고 오류를 처리하기를 원하지 않습니다.getimagesize가 파일을 찾을 수없는 경우의 핸들 오류

어떻게 try catch 작동하는지 모르겠지만 뭔가를 원하는 :

try: getimagesize($img) $works = true 
catch: $works = flase 

답변

40

당신이 말했듯이, getimagesize 경고를 생성 이 코드 :

if ($data = getimagesize('not-existing.png')) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

당신에게

Warning: getimagesize(not-existing.png) [function.getimagesize]: 
    failed to open stream: No such file or directory 
를 얻을 것이다


해결책은 그 오류 마스크의 @ operator을 사용하는 것입니다 : 파일이 존재하지 않기 때문에

if ($data = @getimagesize('not-existing.png')) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

것은, $ 데이터가 여전히 거짓 것이다; 경고는 표시되지 않습니다.


다른 해결책은 getimagesize를 사용하기 전에 check if the file exists입니다. 이 같은 것을 할 것입니다 : 파일이 존재하지 않을 경우, getimagesize가 호출되지

if (file_exists('not-existing.png') && 
    ($data = getimagesize('not-existing.png')) 
    ) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

-

여전히 경고를 의미하는이 솔루션은 당신이 이미지에 사용해야하는 것이 아니다 다른 서버에 있고 HTTP를 통해 액세스 할 수 있습니다 (이 경우). 이는 원격 서버에 대한 두 가지 요청을 의미하기 때문입니다.

로컬 이미지의 경우 매우 괜찮습니다. 내가 볼 수있는 유일한 문제는 마스크되지 않은 읽기 오류가있을 때 생성되는 통지입니다.


마지막 :

나는 오류가 DEVELOPPEMENT 서버에 표시 할 수있는 것
  • ,
  • 그리고 프로덕션 서버에 사람들을 표시하지 않을는 - 그 ;-)
  • 에 대해, display_errors 참조
+4

마음 당신 : 그리고 나는 이런 식으로 뭔가를 보이는 또 다른 해결책을 발견. Veeery는있을 수는 없지만 최악의 순간에 발생합니다 ... – ya23

+1

@ ya23 : true; 하지만 당신은 매우 운이 좋으면 좋겠네요 ^^ 그리고 @를 사용하여 오류를 마스킹하는 것이 싫습니다 : 만약 당신이 그것을 사용하고 있고 문제가있다면 일반적으로 디버그하는 것이 쉽지 않을 것입니다 :-( –

+1

@ 꽤 더러운 :) – Gigala

7

지저분한 더러운 해커 좀비라고 불러주세요.하지만 보통 경고 출력을 출력 버퍼에 저장 한 다음 버퍼를 확인하여이 문제를 해결합니다. 내가 말했듯이,

ob_start(); 
$data = getimagesize('not-existing.png'); 
$resize_warning = ob_get_clean(); 
if(!empty($resize_warning)) { 
    print "NOT OK"; 
    # We could even print out the warning here, just as PHP would do 
    print "$resize_warning"; 
} else { 
    print "OK" 
} 

프로그래머의 하늘에 편안한 장소를 얻을 수있는 방법이 없습니다, 그러나 역기능 오류 처리에 올 때, 사람은 사람이해야하는 일을하는이보십시오.

+7

당신은 지옥에 갈 더러운 해커 좀비입니다. – Seb

5

그런 오래된 주제를 제기하면 유감입니다. 최근 비슷한 문제가 발생하여 해결책 대신이 주제가 발견되었습니다. 종교적인 이유로 나는 '@'가 나쁜 결정이라고 생각한다.file_exists()는 파일이 파일은 단지 메소드 호출 사이에 삭제 될 수 있으므로, getimagesize()가 여전히 실패 할 수있는 것을 요구하면

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new Exception($errstr); 
} 
set_error_handler("exception_error_handler"); 

try { 
    $imageinfo = getimagesize($image_url); 
} catch (Exception $e) { 
    $imageinfo = false; 
}