1. 程式人生 > 程式設計 >PHP實現獲取檔案mime型別多種方法解析

PHP實現獲取檔案mime型別多種方法解析

本文例項講述了php獲取檔案mime型別的方法。分享給大家供大家參考。具體如下:

1.使用 mime_content_type 方法

string mime_content_type ( string $filename )

Returns the MIME content type for a file as determined by using information from the magic.mime file.

<?php 
$mime_type = mime_content_type('1.jpg'); 
echo $mime_type; // image/jpeg 
?>

但此方法在 php5.3 以上就被廢棄了,官方建議使用 fileinfo 方法代替。

2.使用 Fileinfo 方法 (官方推薦)

使用fileinfo需要安裝php_fileinfo擴充套件。

如已安裝可以在extension_dir目錄下找到php_fileinfo.dll(windows),fileinfo.so(linux)

開啟php.ini,把extension=php_fileinfo.dll前的";"去掉,然後重啟apache。

<?php 
$fi = new finfo(FILEINFO_MIME_TYPE); 
$mime_type = $fi->file('1.jpg'); 
echo $mime_type; // image/jpeg 
?>

3.使用 image_type_to_mime_type 方法(只能處理圖象型別)

使用exif_imagetype方法需要安裝php_exif擴充套件,並需要安裝php_mbstring擴充套件

如已安裝可以在extension_dir目錄下找到php_exif.dll(windows),exif.so(linux)

開啟php.ini,把 extension=php_mbstring.dll,extension=php_exif.dll 前的","去掉,然後重啟apache

<?php 
$image = exif_imagetype('1.jpg'); 
$mime_type = image_type_to_mime_type($image); 
echo $mime_type; // image/jpeg 
?>

Tips:如果使用檔名的字尾來判斷,因為檔案字尾是可以修改的,所以使用檔案字尾來判斷會不準確。

php獲取檔案mime型別Fileinfo等方法

前幾天寫到使用wordpress xmlrpc api遠端釋出文章,如果本地伺服器的文章庫裡某一篇待發表的wordpress文章包含圖片檔案時,就會使用到WordPress上傳檔案的API metaWeblog.newMediaObject,該api需要提供檔案的mime 型別。php如 何獲取檔案(圖片)的mime 型別呢?最初遠方部落格使用php mime_content_type()函式,使用開發用的ubuntu server lamp的預設配置測試後完全支援,返回了正確的檔案mime type。但是將該API專案移植到Centos 5.2(核心2.6) LAMP環境時,出現瞭如下錯誤提示:

Fatal error: Call to undefined function: mime_content_type()

最後查看了最新的php手冊發現php mime_content_type()函式已經被廢棄,當然官方不推薦使用,而且需要經過適當的php配置後才能使用。因此要獲取圖片或其他的檔案的 MIME型別,Fatal error: Call to undefined function: mime_content_type()錯誤就有了以下幾種解決方案。

mime_content_type()函式判斷獲取mime型別

如果對已被php 5.3.0廢棄的mime_content_type()函式仍然情有獨鍾,那麼可以對php進行配置啟用magic_mime擴充套件。比如Centos下 使用phpinfo()檢視php apache配置,查詢到mime-magic,如果顯示“--without-mime-magic”,則要編譯php切換到”with-mime- magic“選 項。mime_content_type()函式還依賴於Apache httpd 的magic檔案(mime_magic.magicfile),為了檢測檔案的MIME型別,必須配置告知magic檔案的地址,如'–with- mime-magic=/usr/share/file/magic.mime'。Windows環境下還需要在php.ini中新增:

mime_magic.magicfile = "$PHP_INSTALL_DIRmagic.mime"

其中$PHP_INSTALL_DIR是你的php安裝目錄。在有些LAMP環境下,這個mime_magic檔案不一定存在或可讀,還要另外下載。另外 有些虛擬主機為了安全考慮,即使是有with-mime-magic也不一定會返回正確的mime型別,有時候會返回空字串。因此,就憑 mime_content_type()函式已經被廢棄這一項,就不推薦使用該方法獲取檔案MIME型別了。

php Fileinfo 獲取檔案MIME型別(finfo_open)

PHP官方推薦mime_content_type()的替代函式是Fileinfo函式。PHP 5.3.0+已經預設支援Fileinfo函式(fileinfo support-enabled),不必進行任何配置即可使用finfo_open()判斷獲取檔案MIME型別。Centos 預設安裝的LAMP環境php版本還是PHP5.2.6,低於5.3.0版本則可能出現類似錯誤提示:PHP Fatal error: Call to undefined function finfo_open() in…。因為之前的php版本,需要載入magic_open類,fileinfo函式屬於PECL擴充套件,啟用fileinfo PECL擴展才能檢測MIME型別。所以有兩種途徑使用fileinfo獲取檔案的MIME型別。

將php版本升級到5.3.0以上。php官方也已經不再維護和更新這個fileinfo pecl擴充套件包,所以升級是最好的辦法。

安裝fileinfo pecl擴充套件,Centos linux 如何安裝fileinfo:在Centos下面安裝fileinfo命令(rpm):yum install php-pecl-Fileinfo。或使用原始碼安裝編譯:

cd /usr/src/down && wget http://pecl.php.net/get/Fileinfo-1.0.4.tgz
tar zxvf Fileinfo-1.0.4.tgz
cd /usr/src/down/Fileinfo-1.0.4 && phpize && ./configure && make && make install

還可以使用網上流傳較多的一種方法,Linux通過phpize使用pecl指令來安裝fileinfo:

  • 若沒有phpize指令,需要先安裝。#phpize檢測若提示”No command ‘phpize' found”,則需先安裝phpize;
  • 下載安裝php-devel(php5-dev)的rpm,安裝phpize;
  • service httpd restart 或 reboot;
  • 命令 pecl install fileinfo 安裝fileinfo擴充套件。
  • 安裝完畢,/usr/lib/php/module目錄下多了fileinfo.so檔案,/usr/share/file目錄下多了magic.mime和magic兩個文件
  • 修改php.ini配置:加入 extension=”fileinfo.so”
  • service httpd restart
  • Windows伺服器下安裝fileinfo相似,php.ini:extension=php_fileinfo.dll

image_type_to_mime_type()獲取圖片MIME型別

如果我們需要判斷MIME型別的檔案只有影象檔案,那麼首先可以使用exif_imagetype()函式獲取影象型別常量,再用 image_type_to_mime_type()函式將影象型別常量轉換成圖片檔案的MIME型別。同樣php.ini中要配置開啟 php_mbstring.dll(Windows需要)和extension=php_exif.dll。phpinfo()“–enable-exif”。首先exif_imagetype返回的是影象型別常量(Imagetype Constants),如IMAGETYPE_GIF、IMAGETYPE_JPEG、IMAGETYPE_PNG等。

<?php 
$image = exif_imagetype("D:farleeinfo.jpg");  //本地路徑或遠端圖片地址均可 IMAGETYPE_GIF// 
$image = exif_imagetype("http://farlee.info/wp-content/images/rss_feedsky.gif"); 
$mime = image_type_to_mime_type($image); 
echo $mime; // 輸出image/jpeg 
?>

php上傳檔案獲取MIME型別

如果使用php上傳檔案,檢測上傳檔案的MIME型別,則可以使用全域性變數$_FILES['uploadfile']['type'],由客戶端的瀏覽器檢測獲取檔案MIME型別。

Centos 系統或其他環境下若都不方便獲取檔案MIME型別的話,還有最後一種絕對可行的方法,就是讀取檔名字尾,根據字尾名一一對應檔案的MIME型別,具體可以參考php手冊上的這條評論。當然這種方法檢測到的MIME檔案型別不一定是非常準確的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。