描述
thinkphp多文件上傳時,有些時候會出現文件丟失的情況。比如上傳多個圖片,最終只上傳了一個圖片。本地測試的時候是正常的,但上傳到服務器上就會出現丟失文件這種情況。
原因
查看tp上傳類(ThinkPHP\Library\Think\Upload.class.php)的源碼,最終發現在getName()方法中會經過一些處理生成文件名,而tp官方默認使用時,傳的saveName參數為'saveName' => array('uniqid',''),而多個文件總是會生成一樣的文件名。
解決辦法
初步解決辦法是,在實例化\Think\Upload類后,設置此對象的saveName屬性為array('uniqid', array('', true)),如
$upload = new \Think\Upload();// 實例化上傳類 //其他屬性的設置,略...
//...
//在Upload類中,saveName屬性的缺省默認值是 array('uniqid', '') $upload->saveName = array('uniqid', array('', true));
這樣可使getName()方法生成的文件名更具唯一性,從而避免多文件名重復覆蓋。
(在tp源碼中,當屬性saveName的值為array('uniqid',array('',true))時,此數組中第一個函數會作為函數名,第二個參數會作為這個函數的參數來運行,傳參為array('',true)時,使生成的文件名更具唯一性)
附上 uniqid函數的手冊 http://php.net/manual/zh/function.uniqid.php