在我們日常的開發中,常常需要用到判斷圖片是否存在,存在則顯示,不存在則顯示預設圖片,那麼我們怎麼判斷呢?
getimagesize()函數(推薦學習:PHP程式設計從入門到精通)
getimagesize 函數並不屬於GD 擴充的部分,標準安裝的PHP 都可以使用這個函數。可以先看看這個函數的文檔描述:
http://php.net/manual/zh/function.getimagesize.php
如果指定的檔案如果不是有效的映像,會傳回 false,傳回資料中也有表示文件類型的欄位。如果不用來獲取文件的大小而是使用它來判斷上傳文件是否是圖片文件,看起來似乎是個很不錯的方案,當然這需要屏蔽掉可能產生的警告,比如代碼這樣寫:
<?php $filesize = @getimagesize('/path/to/image.png'); if ($filesize) { do_upload(); } # 另外需要注意的是,你不可以像下面这样写: # if ($filesize[2] == 0) # 因为 $filesize[2] 可能是 1 到 16 之间的整数,但却绝对不对是0。
但是如果你只是做了這樣的驗證,那麼很不幸,你成功的在程式碼裡種下了一個webshell 的隱患。
要分析這個問題,我們先來看看這個函數的原型:
static void php_getimagesize_from_stream(php_stream *stream, zval **info, INTERNAL_FUNCTION_PARAMETERS){ ... itype = php_getimagetype(stream, NULL TSRMLS_CC); switch( itype) { ... } ... }static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) { ... php_getimagesize_from_stream(stream, info, INTERNAL_FUNCTION_PARAM_PASSTHRU); php_stream_close(stream); } PHP_FUNCTION(getimagesize) { php_getimagesize_from_any(INTERNAL_FUNCTION_PARAM_PASSTHRU, FROM_PATH); }
#限於篇幅上面隱藏了一些細節,現在從上面的程式碼我們知道兩件事情就夠了:
最終處理的函數是 php_getimagesize_from_stream
負責判斷檔案類型的函數是 php_getimagetype
接下來看一下 php_getimagetype 的實作:
PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC){ ... if (!memcmp(filetype, php_sig_gif, 3)) { return IMAGE_FILETYPE_GIF; } else if (!memcmp(filetype, php_sig_jpg, 3)) { return IMAGE_FILETYPE_JPEG; } else if (!memcmp(filetype, php_sig_png, 3)) { ... } }
以上是php判斷圖片是否存在的詳細內容。更多資訊請關注PHP中文網其他相關文章!