詳解ThinkPHP怎么實現圖片上傳

下面由thinkphp框架教程欄目給大家介紹thinkphp怎么實現圖片上傳功能,希望對需要的朋友有所幫助!

直接上個例子,其中包括有單圖片文件上傳、多圖片文件上傳、以及刪除文件的一些操作、放置刪除數據庫的時候,僅僅刪除掉了數據庫之中的文件路徑、而不是一并刪除服務器之中的文件、放置服務器爆炸…

TP里面common文件夾里面function.php里面自定義方法:

<?php //文件上傳類(可以設置多個參數) function upload($file=null,$maxSize=0,$exts=0,$savePath=&#39;&#39;) {   //調用   $upload = new ThinkUpload();// 實例化上傳類   $upload->maxSize??=?$maxSize;//?設置附件上傳大小 ??$upload-&gt;exts???=?$exts;?//array('jpg',?'gif',?'png',?'jpeg');?設置附件上傳類型 ??$upload-&gt;savePath?=?$savePath;?//?設置附件上傳目錄 ??//?上傳文件 ??//如果單個文件還是多個文件 ??if($file){ ???$info?=?$upload-&gt;uploadOne($file); ??}else{ ??$info?=?$upload-&gt;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?=&gt;?$v){ ??//判定文件大于0之后,將遍歷value作為參數傳入upload方法 ????if($v['size']?&gt;?0){ ??????$res?=?upload($v,$maxSize,$exts,$savePath); ??????//如果傳入成功就會將文件存儲路徑傳入數組$tmp[]之中 ??????if($res){ ????????$tmp[$k]?=?$res['savepath'].$res['savename']; ??????} ????} ??} ??//將存儲傳入文件路徑的數組return回去 ??return?$tmp; } ?&gt;

其實無論哪個文件上傳、都是需要用$_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?&amp;&amp;?count($new_thumb)?&gt;?0){ ????$input['data']?=?array_merge($input['data'],$new_thumb); } $f?=?$customer-&gt;add($input['data']); if($f){ ????$this-&gt;display('Index/infosuccess'); ????//?$this-&gt;success("添加成功!",U('Index/infocheck',array('iccid'=&gt;$input['data']['iccid']))); }else{//數據添加失敗即刪除照片 ????if($new_thumb){ ??????$p?=?C('UNLINK_PATH').$new_thumb; ??????unlink($p); ????} ????$this-&gt;error("添加失敗!證件可能已存在"); }

其中UNLINK_PATH變量在ThinkPHP之中的config文件里面定義、是路徑來的

<?php return array(   &#39;DB_TYPE&#39;  =>?'mysql',?//?數據庫類型 ??'DB_HOST'??=&gt;?'localhost',?//?服務器地址 ??'DB_NAME'??=&gt;?'urban',?//?數據庫名 ??'DB_USER'??=&gt;?'root',?//?用戶名 ??'DB_PWD'??=&gt;?'123456',?//?密碼 ??'DB_PORT'??=&gt;?3306,?//?端口 ??'DB_PREFIX'?=&gt;?'fab_',?//?數據庫表前綴 ??'DB_CHARSET'=&gt;?'utf8',?//?字符集 ??'CHECK_ROOT'?=&gt;?true,?//開啟rbac權限 ??'TMPL_CACHE_ON'?=&gt;?false,????//?是否開啟模板編譯緩存,設為false則每次都會重新編譯 ??'ACTION_CACHE_ON'?=&gt;?false,?//?默認關閉Action?緩存 ??'HTML_CACHE_ON'??=&gt;?false,??//?默認關閉靜態緩存 ??'FILE_PATH'=&gt;'http://localhost/urban/Uploads/', ??'WEB_PATH'??=&gt;??'http://localhost/urban/index.php/', ??'WEB_URL'??=&gt;??'http://localhost/urban/', ??'UNLINK_PATH'??=&gt;??'./Uploads/', ??'PWD_KEY'??=&gt;?'jeiskAsdlLsdfqaiocvwphxzbtu', ??'AUTO_LOGIN_TIME'=&gt;3600?*?24?*?7, ??'SHOW_PAGE_TRACE'=&gt;true,?//追蹤模式 ??'MY_CATCH_DIR'?=&gt;'./cache/',?//緩存目錄 ??'CODE_PATH'?=&gt;'http://localhost/urban/fabp/phpqrcode/',??//?存放二維碼的目錄 ??'qq_face'?=&gt;'http://localhost/urban/Public/site/images/arclist/',???//qq表情路徑 ??'wxlogin'?=&gt;?array( ????'appid'?=&gt;?'wx35f5b9e9b90539ae', ????'AppSecret'?=&gt;?'4de424bee1529a8abeda9c0c52aad3aa', ????'callback'?=&gt;?'http://localhost/urban/index.php/Home/Login/call_back.html' ????), ??'topic_pass'=&gt;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-&gt;where("brand_id?in?($ids)")-&gt;getField('thumb',true); ????foreach($img?as?$v){ ??????$p?=?C('UNLINK_PATH').$v; ??????unlink($p); ????} ????$res=$brand-&gt;where("brand_id?in?($ids)")-&gt;delete(); ????if($res){ ??????$this-&gt;success("刪除運營商品牌成功!"); ????}else{ ??????$this-&gt;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 == &#39;del&#39;){     $(&#39;#my_form&#39;).attr(&#39;action&#39;,"{:U(&#39;Admin/Brand/brand_del&#39;)}");   }else if(type == &#39;sort&#39;){     $(&#39;#my_form&#39;).attr(&#39;action&#39;,"{:U(&#39;Admin/Brand/brand_sort&#39;)}");   }   return true; } </script>

附加:其實判定文件是否有上傳最好用這個數據:

$_FILES['input_name']['size']

是否大于零;

推薦:《最新的10個thinkphp視頻教程》

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享