ThinkPHP实现图片上传操作的方法详解


Posted in PHP onMay 08, 2017

本文实例讲述了ThinkPHP实现图片上传操作的方法。分享给大家供大家参考,具体如下:

直接上个例子,其中包括有单图片文件上传、多图片文件上传、以及删除文件的一些操作、放置删除数据库的时候,仅仅删除掉了数据库之中的文件路径、而不是一并删除服务器之中的文件、放置服务器爆炸、、

TP里面common文件夹里面function.php里面自定义方法:

<?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上我们表单是酱紫写的:

<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" >如?D示</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" >如?D示</a> -->
</div>
</form>

控制器之中如何处理上传的文件(拼接路径以及文件名、还有入库失败需要删除文件,类似回调)

/*调用写好的方法进行验证*/
$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 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方法是这样写的:

<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>

附加:其实判定文件是否有上传最好用这个数据:

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

是否大于零;

I can see a bigger world.

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP防注入安全代码
Apr 09 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
php学习之 数组声明
Jun 09 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
PHP实现自动登入google play下载app report的方法
Sep 23 PHP
php获取错误信息的方法
Jul 17 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
PHP实现json_decode不转义中文的方法
May 20 PHP
PHP字符串与数组处理函数用法小结
Jan 07 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 #PHP
ThinkPHP框架实现数据增删改
May 07 #PHP
thinkphp 验证码 的使用小结
May 07 #PHP
解析 thinkphp 框架中的部分方法
May 07 #PHP
ThinkPHP 模板引擎使用详解
May 07 #PHP
php中Ioc(控制反转)和Di(依赖注入)
May 07 #PHP
Laravel中任务调度console使用方法小结
May 07 #PHP
You might like
PHP安装全攻略:APACHE
2006/10/09 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
js三种排序算法分享
2012/08/16 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
JQuery遍历元素的父辈和祖先的方法
2016/09/18 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
js实现表格数据搜索
2020/08/09 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
Python中pillow知识点学习
2018/04/30 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
python如何制作缩略图
2019/04/30 Python
python自动生成model文件过程详解
2019/11/02 Python
Python多进程编程常用方法解析
2020/03/26 Python
自我评价范文分享
2014/01/04 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript