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实现验证码功能
Oct 09 PHP
如何去掉文章里的 html 语法
Oct 09 PHP
PHP Google的translate API代码
Dec 10 PHP
php zend 相对路径问题
Jan 12 PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 PHP
php calender(日历)二个版本代码示例(解决2038问题)
Dec 24 PHP
一个简洁实用的PHP缓存类完整实例
Jul 26 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
Windows2003下php5.4安装配置教程(IIS)
Jun 30 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
Nov 20 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
PHP日志LOG类定义与用法示例
Sep 06 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实现jQuery扩展函数
2009/10/30 PHP
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
列表内容的选择
2006/06/30 Javascript
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
Python实现微信机器人的方法
2019/09/06 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
python如何更新包
2020/06/11 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
文秘专业个人求职信
2013/12/22 职场文书
物业工作计划书
2014/01/10 职场文书
给老师的一封建议书
2014/03/13 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
横幅标语大全
2014/06/17 职场文书
六年级语文教学反思
2016/03/03 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
Python中Cookies导出某站用户数据的方法
2021/05/17 Python
asyncio异步编程之Task对象详解
2022/03/13 Python