2009-09-01 52 views
14

khi tôi đang cố gắng getimagesize($img) và hình ảnh không tồn tại, tôi gặp lỗi. Tôi không muốn kiểm tra xem tệp có tồn tại hay không, chỉ cần xử lý lỗi.Xử lý lỗi khi getimagesize không thể tìm thấy tệp

Tôi không chắc chắn như thế nào try catch công trình, nhưng tôi muốn làm một cái gì đó như:

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

Trả lời

40

Giống như bạn nói, nếu được sử dụng trên một tập tin không tồn tại, getimagesize tạo ra một cảnh báo:

mã này:

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

sẽ giúp bạn có một

Warning: getimagesize(not-existing.png) [function.getimagesize]: 
    failed to open stream: No such file or directory 


Một giải pháp sẽ được sử dụng @ operator, để che dấu rằng lỗi:

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

Như các tập tin không tồn tại, $ dữ liệu sẽ vẫn là sai lầm; nhưng không có cảnh báo nào được hiển thị.


Một giải pháp khác sẽ là check if the file exists, trước khi sử dụng getimagesize; một cái gì đó như thế này sẽ làm:

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

Nếu tập tin không tồn tại, getimagesize không được gọi - có nghĩa là không cảnh báo

Tuy nhiên, giải pháp này không phải là người bạn nên sử dụng cho hình ảnh mà trên một máy chủ khác, và truy cập qua HTTP (nếu bạn đang ở trong trường hợp này), vì nó sẽ có nghĩa là hai yêu cầu đến máy chủ từ xa.

Đối với hình ảnh địa phương, điều đó sẽ khá OK, tôi cho là; chỉ có vấn đề tôi thấy là thông báo được tạo ra khi có lỗi đọc không bị che khuất.


Cuối cùng:

  • tôi sẽ cho phép các lỗi sẽ được hiển thị trên máy chủ developpement của bạn,
  • Và sẽ không hiển thị những trên máy chủ sản xuất của bạn - xem display_errors, về điều đó ;-)
+4

Lưu ý rằng, tập tin getimagesize() có thể vẫn không thành công, vì tập tin có thể bị xóa ngay giữa các cuộc gọi phương thức. Veeery không, nhưng sẽ xảy ra trong những khoảnh khắc tồi tệ nhất ... – ya23

+1

@ ya23: true; nhưng bạn sẽ rất không may mắn ^^ Và tôi không thích các lỗi mặt nạ với @: nếu bạn đang sử dụng nó, và có một vấn đề, nó thường nhanh chóng là một nỗi đau để gỡ lỗi :-( –

+1

Vâng tôi nghĩ rằng @ là khá bẩn :) – Gigala

7

Gọi cho tôi là một hacker hacker bẩn thỉu sẽ xuống địa ngục, nhưng tôi thường gặp vấn đề này bằng cách bắt đầu cảnh báo vào bộ đệm đầu ra, sau đó kiểm tra bộ đệm. Hãy thử điều này:

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" 
} 

Như tôi đã nói, không phải là cách để có được một nơi ấm cúng ở trên trời lập trình viên, nhưng khi nói đến xử lý lỗi bất thường, một người đàn ông đã làm những gì một người đàn ông đã làm.

+7

Bạn là một zombie hacker bẩn thỉu sẽ đi xuống địa ngục. – Seb

5

Tôi xin lỗi vì đã nêu chủ đề cũ như vậy. Gần đây đã gặp phải một vấn đề tương tự và tìm thấy chủ đề này thay vì một giải pháp. Vì lý do tôn giáo, tôi nghĩ rằng '@' là một quyết định tồi tệ.Và sau đó tôi tìm thấy một giải pháp khác, nó trông giống như thế này:

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; 
} 
Các vấn đề liên quan