下面由thinkphp框架教程欄目給大家介紹thinkphp怎么實現圖片上傳功能,希望對需要的朋友有所幫助!
直接上個例子,其中包括有單圖片文件上傳、多圖片文件上傳、以及刪除文件的一些操作、放置刪除數據庫的時候,僅僅刪除掉了數據庫之中的文件路徑、而不是一并刪除服務器之中的文件、放置服務器爆炸…
TP里面common文件夾里面function.php里面自定義方法:
<?php //文件上傳類(可以設置多個參數) function upload($file=null,$maxSize=0,$exts=0,$savePath='') { //調用 $upload = new ThinkUpload();// 實例化上傳類 $upload->maxSize??=?$maxSize;//?設置附件上傳大小 ??$upload->exts???=?$exts;?//array('jpg',?'gif',?'png',?'jpeg');?設置附件上傳類型 ??$upload->savePath?=?$savePath;?//?設置附件上傳目錄 ??//?上傳文件 ??//如果單個文件還是多個文件 ??if($file){ ???$info?=?$upload->uploadOne($file); ??}else{ ??$info?=?$upload->upload(); ??} ??//判定是否文件上傳成功de ??if(!$info)?{ ????return?false; ??}else{ ??//?上傳成功, ????return?$info; ??} } //上傳圖片 function?fab_upload($files?,$maxSize?=?0,$exts?=?null,$savePath?=?'') { ??//判定文件信息是否為空 ??if(empty($files)){ ????return?false; ??} ??if($exts?===?null){ ????$exts?=?array('jpg',?'gif',?'png',?'jpeg'); ??}else{ ????$exts?=?0; ??} ??$tmp?=?array(); ??//將文件信息(數組)用foreach循環遍歷, ??foreach($files?as?$k?=>?$v){ ??//判定文件大于0之后,將遍歷value作為參數傳入upload方法 ????if($v['size']?>?0){ ??????$res?=?upload($v,$maxSize,$exts,$savePath); ??????//如果傳入成功就會將文件存儲路徑傳入數組$tmp[]之中 ??????if($res){ ????????$tmp[$k]?=?$res['savepath'].$res['savename']; ??????} ????} ??} ??//將存儲傳入文件路徑的數組return回去 ??return?$tmp; } ?>
其實無論哪個文件上傳、都是需要用$_FILES變量區操控的、
上面的方法是fab_upload調用upload方法的;
立即學習“PHP免費學習筆記(深入)”;
在HTML上我們表單是醬紫寫的:
控制器之中如何處理上傳的文件(拼接路徑以及文件名、還有入庫失敗需要刪除文件,類似回調)
/*調用寫好的方法進行驗證*/ $new_thumb?=?fab_upload($_FILES); //?var_dump($new_thumb);die; $input['data']['addtime']=time();//生成申請時間 $input['data']['pretime']=strtotime($input['data']['pretime']);//將傳過來的日期轉換成時間戳 if($new_thumb?&&?count($new_thumb)?>?0){ ????$input['data']?=?array_merge($input['data'],$new_thumb); } $f?=?$customer->add($input['data']); if($f){ ????$this->display('Index/infosuccess'); ????//?$this->success("添加成功!",U('Index/infocheck',array('iccid'=>$input['data']['iccid']))); }else{//數據添加失敗即刪除照片 ????if($new_thumb){ ??????$p?=?C('UNLINK_PATH').$new_thumb; ??????unlink($p); ????} ????$this->error("添加失敗!證件可能已存在"); }
其中UNLINK_PATH變量在ThinkPHP之中的config文件里面定義、是路徑來的
<?php return array( 'DB_TYPE' =>?'mysql',?//?數據庫類型 ??'DB_HOST'??=>?'localhost',?//?服務器地址 ??'DB_NAME'??=>?'urban',?//?數據庫名 ??'DB_USER'??=>?'root',?//?用戶名 ??'DB_PWD'??=>?'123456',?//?密碼 ??'DB_PORT'??=>?3306,?//?端口 ??'DB_PREFIX'?=>?'fab_',?//?數據庫表前綴 ??'DB_CHARSET'=>?'utf8',?//?字符集 ??'CHECK_ROOT'?=>?true,?//開啟rbac權限 ??'TMPL_CACHE_ON'?=>?false,????//?是否開啟模板編譯緩存,設為false則每次都會重新編譯 ??'ACTION_CACHE_ON'?=>?false,?//?默認關閉Action?緩存 ??'HTML_CACHE_ON'??=>?false,??//?默認關閉靜態緩存 ??'FILE_PATH'=>'http://localhost/urban/Uploads/', ??'WEB_PATH'??=>??'http://localhost/urban/index.php/', ??'WEB_URL'??=>??'http://localhost/urban/', ??'UNLINK_PATH'??=>??'./Uploads/', ??'PWD_KEY'??=>?'jeiskAsdlLsdfqaiocvwphxzbtu', ??'AUTO_LOGIN_TIME'=>3600?*?24?*?7, ??'SHOW_PAGE_TRACE'=>true,?//追蹤模式 ??'MY_CATCH_DIR'?=>'./cache/',?//緩存目錄 ??'CODE_PATH'?=>'http://localhost/urban/fabp/phpqrcode/',??//?存放二維碼的目錄 ??'qq_face'?=>'http://localhost/urban/Public/site/images/arclist/',???//qq表情路徑 ??'wxlogin'?=>?array( ????'appid'?=>?'wx35f5b9e9b90539ae', ????'AppSecret'?=>?'4de424bee1529a8abeda9c0c52aad3aa', ????'callback'?=>?'http://localhost/urban/index.php/Home/Login/call_back.html' ????), ??'topic_pass'=>false,??//是否開啟話題審核 );
當添加以后,自然需要在后臺管理模塊上添加刪除的function
上面的顯示圖片的時候,用HTTP協議的絕對路徑拼接出來顯示圖片;
而刪除圖片則是,以入口文件index.php為準,是當前文件夾下面的upload文件夾;
記住調用ThinkPHP之中的upload、uploadone方法返回來的只是上傳文件在upload文件夾下面的存儲位置、“’2016-09-02/57c94e71f0916.png’”(入庫也這個吧)
所以無論刪除還是顯示都需要用C方法拼接一下
if(IS_POST){ ????$input=I('post.'); ????$ids=implode(',',$input['id']); ????$brand=D('brand'); ????$img=$brand->where("brand_id?in?($ids)")->getField('thumb',true); ????foreach($img?as?$v){ ??????$p?=?C('UNLINK_PATH').$v; ??????unlink($p); ????} ????$res=$brand->where("brand_id?in?($ids)")->delete(); ????if($res){ ??????$this->success("刪除運營商品牌成功!"); ????}else{ ??????$this->error("刪除運營商品牌失敗!"); ????} }
之所以用了那個foreach;是因為傳過來的id不是唯一一個;是多選,刪除;
多選,并且傳過去相應欄目ID的值是如何實現的呢
<foreach> ??<tr> ????<td> ??????<label> ????????<input> ????????<span></span> ??????</label> ????</td> ????<td>{$v.brand_name}</td> ??</tr></foreach><tr> ????<td> ??????<button> ????????<i></i> ????????刪除 ??????</button> ?????</td> ??</tr>
上面刪除的javascript方法是這樣寫的:
<script> function tijiao(type){ if(type == 'del'){ $('#my_form').attr('action',"{:U('Admin/Brand/brand_del')}"); }else if(type == 'sort'){ $('#my_form').attr('action',"{:U('Admin/Brand/brand_sort')}"); } return true; } </script>
附加:其實判定文件是否有上傳最好用這個數據:
$_FILES['input_name']['size']
是否大于零;
推薦:《最新的10個thinkphp視頻教程》