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 相关文章推荐
Win2000+Apache+MySql+PHP4+PERL安装使用小结
Oct 09 PHP
基于php验证码函数的使用示例
May 03 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
php实现两个数组相加的方法
Feb 17 PHP
php压缩和解压缩字符串的方法
Mar 14 PHP
php使用wordwrap格式化文本段落的方法
Mar 17 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
Smarty模板常见的简单应用分析
Nov 15 PHP
PHP对象相关知识总结
Apr 09 PHP
php 如何设置一个严格控制过期时间的session
May 05 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 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
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
php用正则表达式匹配中文实例详解
2013/11/06 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
js+css3实现简单时钟特效
2020/09/13 Javascript
Python中的各种装饰器详解
2015/04/11 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
python模拟实现斗地主发牌
2020/01/07 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
应聘教师推荐信
2013/10/31 职场文书
咖啡店自主创业商业计划书
2014/01/22 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
如何写好建议书
2014/03/13 职场文书
空气的环保标语
2014/06/12 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript