php文件上傳代碼標(biāo)配的一個(gè)擴(kuò)展了,為什么呢?(一)_php文件域上傳
2022-05-02
今天來學(xué)習(xí)的擴(kuò)展,其實(shí)是標(biāo)準(zhǔn)擴(kuò)展php文件上傳代碼,為什么呢?因?yàn)榭蚣茉诎惭b的時(shí)候是必要的擴(kuò)展,如果不開啟,連框架都無法使用。
簡介
是通過給定的字節(jié)序列庫獲取文件的內(nèi)容類型和編碼。它獲取的序列庫是根據(jù)操作系統(tǒng)確定的。例如網(wǎng)站優(yōu)化,系統(tǒng)默認(rèn)使用文件/usr//misc/。其實(shí)我們可以通過這個(gè)擴(kuò)展函數(shù)來獲取文件的MIME信息,就像我們常見的/png和text/html內(nèi)容一樣。
此擴(kuò)展同時(shí)兼容新舊開發(fā)模式,因此提供了面向過程和面向?qū)ο髢煞N形式。下面我們來看看面向?qū)ο蟮谋韱问侨绾问褂玫摹?/p>
面向?qū)ο蟮氖褂?/p>
$finfo?=?new?finfo(FILEINFO_MIME);
echo?$finfo->file("./1.PHP中的日期相關(guān)函數(shù)(三).php"),?PHP_EOL;
//?text/x-php;?charset=us-ascii
echo?$finfo->buffer(file_get_contents("https://www.baidu.com"))?.?"\n";
//?text/html;?charset=utf-8
$finfo->set_flags(FILEINFO_EXTENSION);
echo?$finfo->file('timg.jpeg')?.?"\n";
//?jpeg/jpg/jpe/jfif
首先,我們通過一個(gè)新的類來獲取文件操作對象。參數(shù)中的常量是可選的。默認(rèn)情況下,表示沒有特殊處理。這里我們用它來表示文件的mime類型和編碼。
然后使用file()方法獲取指定文件的mime信息。 () 方法返回字符串內(nèi)容的信息。例如,如果我們獲取一個(gè)網(wǎng)頁信息的內(nèi)容,我們可以得到它的字符串表示的文件編碼格式為 text/hmtl 。 () 方法是在實(shí)例化對象后修改其構(gòu)造參數(shù)屬性,也就是我們實(shí)例化時(shí)設(shè)置的參數(shù)信息,這里我們修改為 ,即讓對象返回文件可能的擴(kuò)展名。我們使用圖片進(jìn)行了測試,返回的可能擴(kuò)展名包括評論中顯示的擴(kuò)展名。
面向過程
對于上面的面向?qū)ο蟠a,讓我們也展示一下使用面向過程的函數(shù)如何進(jìn)行相同的操作。
$finfo?=?finfo_open(FILEINFO_MIME);
echo?finfo_file($finfo,"./1.PHP中的日期相關(guān)函數(shù)(三).php"),?PHP_EOL;
//?text/x-php;?charset=us-ascii
echo?finfo_buffer($finfo,?file_get_contents("https://www.baidu.com")),?PHP_EOL;
//?text/html;?charset=utf-8
finfo_set_flags($finfo,?FILEINFO_EXTENSION);
echo?finfo_file($finfo,?'timg.jpeg')?.?"\n";
//?jpeg/jpg/jpe/jfif
finfo_close($finfo);
可以看出,這里是用()方法替換對象,獲取操作句柄。然后使用類似的 () , () , () 函數(shù)進(jìn)行操作,達(dá)到的效果和上面面向?qū)ο蟮慕Y(jié)果是一樣的。
需要注意的是,面向過程的寫法有一個(gè)()方法。一般對句柄類型的操作都有一個(gè)關(guān)閉函數(shù)來釋放句柄資源。就像一個(gè)擴(kuò)展一樣,它也包含這樣一個(gè)功能,并且只為過程提供這個(gè)功能。上面的類中沒有這樣的()方法。
快速返回 mime
當(dāng)然,擴(kuò)展也為我們提供了一個(gè)快速返回文件mime信息的功能。我們可以在不使用對象或打開句柄的情況下快速輕松地獲取文件的mime信息。
echo?mime_content_type('./1.PHP中的日期相關(guān)函數(shù)(三).php'),?PHP_EOL;
//?text/x-php
echo?mime_content_type('./timg.jpeg'),?PHP_EOL;
//?image/jpeg
不過PHP官方好像已經(jīng)棄用了這個(gè)功能,不過現(xiàn)在已經(jīng)恢復(fù)了,也就是說不特別推薦使用這個(gè)功能。在正式的開發(fā)過程中,大家不要太麻煩。使用對象或相關(guān)函數(shù)獲取mime信息更可靠。
如果我們確定要判斷的文件只是圖片類型,那么我們也可以使用另外一個(gè)函數(shù)來獲取圖片文件的mime。
總結(jié)
很簡單但是很有用的功能php文件上傳代碼,為什么有用呢?上傳文件的安全問題可以通過它解決。我們在上傳文件時(shí),通常會在上傳數(shù)組中判斷文件的擴(kuò)展名和文件的MIME類型。但是很多工具可以在上傳過程中修改文件的MIME類型,即通過一些抓包工具修改-Type。但是通過擴(kuò)展獲取的文件必須是本地或遠(yuǎn)程存在的,也就是說不會出現(xiàn)上傳過程中修改傳輸信息導(dǎo)致的安全檢查繞過問題。
因此網(wǎng)站制作,在框架中, ///src///.php 類中的() 方法使用() 函數(shù)來獲取文件的mime 信息。在其上傳組件中,在底層框架中,對上傳文件的MIME判斷也是使用()函數(shù),(//mime/ser.php)沒有直接使用正常上傳的$type字段。
測試代碼:
學(xué)習(xí)在 PHP.php 中使用擴(kuò)展
參考文件: