本文实例讲述了ThinkPHP实现图片上传操作的方法。分享给大家供大家参考,具体如下:
直接上个例子,其中包括有单图片文件上传、多图片文件上传、以及删除文件的一些操作、放置删除数据库的时候,仅仅删除掉了数据库之中的文件路径、而不是一并删除服务器之中的文件、放置服务器爆炸、、
TP里面common文件夹里面function.php里面自定义方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
<?php //文件上传类(可以设置多个参数) function upload( $file =null, $maxSize =0, $exts =0, $savePath = '' ) { //调用 $upload = new \Think\Upload(); // 实例化上传类 $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方法的;
在HTML上我们表单是酱紫写的:
1
2
3
4
5
6
7
8
9
10
|
< form action = "{:U('Index/infoupload')}" method = "post" style = "overflow: hidden;clear: both;" enctype = "multipart/form-data" > < div class = "contact_r col-md-4" > < label class = "contact_rc contact_file" >< span >< b >入台證:</ b >< input class = "inp_zj1" type = "file" name = "rutaiimg" ></ span ></ label > <!-- <a class="contact_sp fancybox" href="images/txz1.jpg" rel="external nofollow" rel="external nofollow" >如圖示</a> --> </ div > < div class = "contact_r col-md-4" > < label class = "contact_rc contact_file" >< span >< b >通行證:</ b >< input class = "inp_zj2" type = "file" name = "tongxingimg" ></ span ></ label > <!-- <a class="contact_sp fancybox" href="images/txz1.jpg" rel="external nofollow" rel="external nofollow" >如圖示</a> --> </ div > </ form > |
控制器之中如何处理上传的文件(拼接路径以及文件名、还有入库失败需要删除文件,类似回调)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/*调用写好的方法进行验证*/ $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文件里面定义、是路径来的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<?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方法拼接一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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的值是如何实现的呢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
< foreach name = "list" item = "v" > < tr > < td class = "center" width = "80px" > < label > < input type = "checkbox" class = "ace" name = "id[]" value = "{$v.brand_id}" /> < span class = "lbl" ></ span > </ label > </ td > < td >{$v.brand_name}</ td > </ tr > </ foreach > < tr > < td colspan = "2" > < button class = "btn btn-xs btn-danger" onclick = "return tijiao('del')" > < i class = "icon-trash bigger-110" ></ i > 删除 </ button > </ td > </ tr > |
上面删除的javascript方法是这样写的:
1
2
3
4
5
6
7
8
9
10
|
<script type= "text/javascript" > 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> |
附加:其实判定文件是否有上传最好用这个数据:
1
|
$_FILES [ 'input_name' ][ 'size' ] |
是否大于零;
I can see a bigger world.
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。