作者tkdmaf (皮皮快跑)
看板PHP
標題[心得] CodeIgniter檔案上傳的錯誤。(by firefox)
時間Mon Mar 22 11:51:17 2010
會發這篇主要是最終和另一位資深工程師找到了正確的問題點。
如果有人使用CodeIgniter可能會發現為什麼像是doc或是zip在firefox會無法上傳。
我們找了很多文章,包括一位大陸人寫的修改Upload.php的方法。
但那不是個好方法。儘可能的我們不應該去動到原本的設計結構。
可以確定的是,那位大陸工程師用的是xdebug+firefox。
所以他動了Upload.php的這一串。
function is_allowed_filetype()
{
if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))
{
$this->set_error('upload_no_file_types');
return FALSE;
}
他把$this->set_error('upload_no_file_types')和return FLASE拿掉
換成了return TURE;
等同是強迫在無設定上傳副檔名下,強迫上傳。
而不去做圖形的判別。
但既然原來的程式功能就是要去做判別。
我們就不應該隨便去修改人家的好意。
最終經過一長串的重新xdebug之後我們卻意外的發現到一個很奇怪的狀況。
我們一樣debug到Upload.php這隻檔。
卻意外發現firefox傳回來到$file_type的值是:applocation/msword
但是在mimes的設定是:application/msword
再用ie下去測試時,也發現傳過來的是:application/msword
即使英文很爛的我,還是不免去google一下application和applocation
然後就發現applocation查無此字。
所以那是錯別字(搞英文?)
很明顯的firefox的開發工程師在設定傳回檔案資料的形態時打錯字了。
這就是為什麼使用CodeIgniter的上傳功能會變成無法上傳zip和doc。
當然應該還有其他只要有application的檔案形態在firefox就會通通不能跑。
解決的方式就是system/application/config/mimes.php
把'doc' => 'appliction/doc'
改成:
'doc' => array('application/msword','applocation/msword');
(ZIP或其他檔案格式也都依此方法修正)
這樣就可以讓ie和firefox通吃上傳的格式了。
雖然我不知道到底要怎樣才會讓firefox修正這個問題。
另外就是關於$config["allowed_types"] = "jpg|gif|png|doc";
會造成不能上傳的問題。
那是codeigniter邏輯上的錯誤。
這個倒是有文件指出來。
不過基於避免因為擅自修改系統功能檔案造成維護性的問題。
只能請大家暫時使用$config["allowed_types"] = "doc|jpg|gif|png";
也就是上傳是圖形類別的副檔名放在最後面。
然後期待下一版出來時,開發團隊能修正這個邏輯bug。
修正文章錯誤:
'doc' => array('application/doc','applocation/doc');
應為:
'doc' => array('application/msword','applocation/msword');
system/config/mimes.php
應為
system/application/config/mimes.php
(錯誤處已修正)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.137.189.252
推 kylekai:幹得好!!! 03/22 12:06
推 awashharp:推薦這篇文章!好熱心!@@ 03/22 14:16
※ 編輯: tkdmaf 來自: 220.137.189.252 (03/22 14:35)
→ mervynW:GJ , 回報firefox bug 會有很多人感謝你的 03/22 16:33
推 cjoe:推 03/22 23:06
推 DRLai:推一個,m一下吧XDD 03/23 12:49
推 ccghost:太厲害了,酷~ 07/04 22:15