2012-09-27 43 views
0

想檢查我上傳的圖片進行正確的MIME類型:PHP警予錯誤的MIME類型CFileHelper :: getMimeType

$user->image = CUploadedFile::getInstance($user, 'image'); 
在我的驗證

我檢查MIME類型:

print_r(CFileHelper::getMimeType($this->image)); 

好,我上載pdf和mime類型是application/pdf。 我將pdf重新命名爲test.jpg,而MIME類型現在是image/jpg這是一個問題。我只想接受圖像。

我使用的最新版本: yii-1.1.12.b600af; XAMPP Windows 1.8.0; PHP版本5.4.4

回答

2

因爲Yii默認根據擴展名定義了mime類型。

You can see the code

public static function getMimeType($file,$magicFile=null,$checkExtension=true){//code} 

正如你看到$checkExtension=true

你可以嘗試這樣的:

print_r(CFileHelper::getMimeType($this->image, null, false)); 

,所以它不會推而廣之決定。

爲了驗證目的:

class Item extends CActiveRecord 
{ 
    public $image; 

    public function rules() 
    { 
     return array(
      array('image', 'file', 'mimeTypes'=>'image/gif, image/jpeg'), 
     ); 
    } 
} 

送花兒給人利用現有的東西,不要試圖重新創建。

+0

那是不正確的。正如你在源代碼中看到的,首先檢查finfo_open是否存在,然後使用它。如果不是,請使用mime_content_type,最後一個是通過擴展名檢查它。在我的情況下,它使用finfo_open。 –

+0

sry,在我的情況下,它使用擴展,因爲我發現調用未定義函數finfo_open()和調用未定義函數mime_content_type()。如果你設置false作爲第三個參數,它只返回NULL –

+0

如果你滿足這個要求,它將解決所有問題:http://php.net/manual/en/function.finfo-open.php。你可以使用finfo_open函數。 PHP已經符合,但PECL應該是PECL fileinfo> = 0.1.0 – Elbek

0

PHP提供finfo_open(),它實際上試圖從文件的內容中提取mimetype。使用像這樣:

$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
$mediaFile->filemime = finfo_file($finfo, $fileName); 
    /* close connection */ 
finfo_close($finfo); 

在這裏閱讀更多:http://php.net/manual/en/function.finfo-open.php

在我有限的經驗,finfo_open()效果很好。