Codeigniter文件上傳類型不匹配錯誤

Codeigniter的文件上傳類方便了咱們使用PHP來處理文件上傳的操做,使用起來很是簡單,以下:
 
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width']  = '1024';
$config['max_height']  = '768';
 
$this->load->library('upload', $config);
 
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_form', $error);
}
else
{
$data = array('upload_data' => $this->upload->data());
$this->load->view('upload_success', $data);
}
 
若是隻是處理圖片類型的文件,基本上不會遇到這個坑,若是處理到了 excel、zip、rar類型的文件,你可能就會遇到明明在 allowed_types 中容許的文件類型,最後收穫了 「The filetype you are attempting to upload is not allowed.」的錯誤,爲何會這樣呢?
 
Codeigniter的文件上傳類型判斷在 is_allowed_filetype 這個函數中處理,形成這個錯誤的主要緣由是由於判斷邏輯中有一個 mime 類型判斷的步驟。
 
什麼是 Mime 呢?
 
MIME是Multipurpose Internet Mail Extention的縮寫,是描述消息內容類型的互聯網標準。
 
爲何須要判斷 Mime?由於若是隻從文件後綴來判斷文件類型,是很是危險的。不懷好意的用戶可能會把一個可執行文件後綴改爲圖片類型,上傳成功後,若是可以得到文件的地址,而且文件在可執行目錄,就可以執行動態腳本,仍是很危險的。著名的DedeCMS就不少這種漏洞。
 
針對不一樣的後綴,Codeigniter會從 config/mimes.php 文件匹配POST過來的數據中的 file_type 屬性,只有同樣纔會校驗經過,不然就會發生文件類型不匹配的錯誤。
 
找到問題的緣由,解決起來就很方便了。咱們只須要在 config/mimes.php 文件中,添加對應的後綴以及file_type 這樣就能解決這個問題。下面是我爲幾種常見文件增長的配置:
 
'docx'     =>     array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip'),
'xlsx'     =>     array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'),
'xlsm'     =>     array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','application/vnd.ms-excel.sheet.macroenabled.12', 'application/zip'),
'word'     =>     array('application/msword', 'application/octet-stream'),
'rar'     =>     array('application/octet-stream'),
'zip'     =>  array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/octet-stream'),
 
補充:我這裏使用的Codeigniter是2.x版本的,至於如今3.x版本中是否還存在這個問題並無測試,有遇到的朋友能夠分享一下。
 
參考資料:
一、 W3c Mime
二、 百科 Mime
相關文章
相關標籤/搜索