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将数据导入到Foxmail
Oct 09 PHP
一个PHP针对数字的加密解密类
Mar 20 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
php阳历转农历优化版
Aug 08 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
Nov 05 PHP
详解PHP的抽象类和抽象方法以及接口总结
Mar 15 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
PHP反射学习入门示例
Jun 14 PHP
在laravel框架中使用model层的方法
Oct 08 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 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
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
javascript实现密码验证
2015/11/10 Javascript
Vue组件开发初探
2017/02/14 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
在Python的Django框架中编写错误提示页面
2015/07/22 Python
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
利用python 下载bilibili视频
2020/11/13 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
培训主管的岗位职责
2013/11/23 职场文书
料理师求职信
2014/01/30 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
生活委员竞选稿
2015/11/21 职场文书