首頁 > 後端開發 > PHP問題 > php判斷圖片是否存在

php判斷圖片是否存在

(*-*)浩
發布: 2023-02-25 10:56:02
原創
4560 人瀏覽過

在我們日常的開發中,常常需要用到判斷圖片是否存在,存在則顯示,不存在則顯示預設圖片,那麼我們怎麼判斷呢?

php判斷圖片是否存在

getimagesize()函數(推薦學習:PHP程式設計從入門到精通

getimagesize 函數並不屬於GD 擴充的部分,標準安裝的PHP 都可以使用這個函數。可以先看看這個函數的文檔描述:

http://php.net/manual/zh/function.getimagesize.php
登入後複製

如果指定的檔案如果不是有效的映像,會傳回 false,傳回資料中也有表示文件類型的欄位。如果不用來獲取文件的大小而是使用它來判斷上傳文件是否是圖片文件,看起來似乎是個很不錯的方案,當然這需要屏蔽掉可能產生的警告,比如代碼這樣寫:

<?php
$filesize = @getimagesize(&#39;/path/to/image.png&#39;);
if ($filesize) {
    do_upload();
}

# 另外需要注意的是,你不可以像下面这样写:
# if ($filesize[2] == 0)
# 因为 $filesize[2] 可能是 1 到 16 之间的整数,但却绝对不对是0。
登入後複製

但是如果你只是做了這樣的驗證,那麼很不幸,你成功的在程式碼裡種下了一個webshel​​l 的隱患。

要分析這個問題,我們先來看看這個函數的原型:

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中文網其他相關文章!

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板