Thinkphp 文件上传方法总结

Thinkphp3.2 本身提供了上传功能,至于需不需要下载新的扩展库我不清楚,反正我下载的是3.2的完整版。

支持多文件上传和单文件上传,本篇文章主要说明的是单文件上传功能。


首先看下前端页面的提交表单

 <form action="/User/Index/add" method="post" enctype="multipart/form-data">
        <table width="100%" class="member_table"  border="0" cellspacing="0" cellpadding="0">
          <tbody>
            <tr>
              <td width="21%" align="right">商品名称:</td>
              <td width="79%"><input type="text" name="commodity_name" value="<{$item.commodity_name}>" /></td>
            </tr>
            <tr>
            <tr>
              <td align="right">缩略图::</td>
              <td><input type="file" name="img_url"><br /><if condition="!empty($item['img_url'])"><img src="<{$item.img_url}>" width="50" height="50"/></if></td>
            </tr>
          <tr>
              <td colspan="2" align="center"><input  type="submit" class="confrim" value="确认" /></td>
          </tr>
          </tbody>
        </table>
        </form>

然后是控制器代码,控制器代码有2个方法,add方法和upload 方法,其中upload方法是TP的指定基础方法,具体参考:http://www.kancloud.cn/manual/thinkphp/1876


1.代码是通用的多图片上传,$info为二维数组

add方法,其中字段保存的代码有删减,请主要看上传部分的代码。


   public function add() {

        if (IS_POST) {
            $supplies = D('supplies');
            $info     = $this->upload();
            if (!$info) {  //判断是否上传成功
                $this->error('图片上传失败', '/User/Index/add');return;
            }
            
          foreach ((array) $info as $k => $v) {//因为输出的是二维数组,所以遍历取得数组内的值拼成img_url
                $img_url =$k;
                if (empty($k)){
					$img_url = 'img_url';
					}; 
                $supplies->$img_url =  '/Public/default/user/' . $v['savepath'] . $v['savename'];//得到图片url地址
            }
    
            $supplies->user_id = (int) $_SESSION['current_user_info']['id'];//此处省略字段赋值的代码
            if ($supplies->add()) {//
                $this->success('保存成功', '/User/Index/sls',3);
				var_dump($info);//打印$info看一下具体信息
				return;
				
            }
            $this->error('保存失败', '/User/Index/add');return;
        }
        $this->assign('type_list', $supplies_type->select());
        $this->display();
    }


从这里可以看到$info的具体内容为一个二维数组:

array (size=1)
  'img_url' => 
    array (size=9)
      'name' => string '1418019267954.jpg' (length=17)
      'type' => string 'image/jpeg' (length=10)
      'size' => int 456921
      'key' => string 'img_url' (length=7)
      'ext' => string 'jpg' (length=3)
      'md5' => string 'ffe4b32290ada49cd5e12d3303e89538' (length=32)
      'sha1' => string '99b65b41f6a5be015f06b050db594afcdcb9beea' (length=40)
      'savename' => string '5750287ec1ebf.jpg' (length=17)
      'savepath' => string '20160602/' (length=9)

所以需要遍历出来然后得到 img_url。再看upload方法,是照搬TP的实例:

protected function upload() {
			
        $config = array(
            'maxSize'    =>    0,
            'rootPath'   =>    './Public/default/user/',
            'savePath'   =>    '',
            'saveName'   =>    array('uniqid',''),
            'exts'       =>    array('jpg', 'gif', 'png', 'jpeg'),
            'autoSub'    =>    true,
            'subName'    =>    array('date','Ymd'),
        );
        $upload = new \Think\Upload($config);// 实例化上传类
        $info = $upload->upload();
        if (!$info) return false;
        return $info;
    }


2.单文件上传,$info为一维数组,不需要遍历即可得到img_url

add方法

public function add() {
       
        if (IS_POST) {
            $supplies = D('supplies');
            $info     = $this->upload();//执行upload方法
            if (!$info) {//判断是否上传成功
                $this->error('图片上传失败', '/User/Index/sadd');return;
            }
            
          
            $supplies->img_url= '/Public/default/user/' .$info['savepath']. $info['savename'];//这里不用遍历即可得到img_url
            
            if ($supplies->add()) {
                $this->success('保存成功', '/User/Index/sls',30);
				var_dump($info);
				return;
				
            }
            $this->error('保存失败', '/User/Index/add');return;
        }
        $this->display();
    }


从代码可以看出单文件上传不需要foreach遍历即可.

再看upload方法

 protected function upload() {
			
        $config = array(
            'maxSize'    =>    0,
            'rootPath'   =>    './Public/default/user/',
            'savePath'   =>    '',
            'saveName'   =>    array('uniqid',''),
            'exts'       =>    array('jpg', 'gif', 'png', 'jpeg'),
            'autoSub'    =>    true,
            'subName'    =>    array('date','Ymd'),
        );
        $upload = new \Think\Upload($config);// 实例化上传类
	$info = $upload->uploadOne($_FILES['img_url']);//只有这里有改变,使用了uploadOne方法,参数要和表单的上传input名称一致
        if (!$info) return false;
        return $info;
    }
	

var_dump($info)得到的值为一维数组

    array (size=9)
      'name' => string '1418019267954.jpg' (length=17)
      'type' => string 'image/jpeg' (length=10)
      'size' => int 456921
      'key' => string 'img_url' (length=7)
      'ext' => string 'jpg' (length=3)
      'md5' => string 'ffe4b32290ada49cd5e12d3303e89538' (length=32)
      'sha1' => string '99b65b41f6a5be015f06b050db594afcdcb9beea' (length=40)
      'savename' => string '5750287ec1ebf.jpg' (length=17)
      'savepath' => string '20160602/' (length=9)



总结:本文章主要说明的是单图上传功能,从代码可以看出使用uploadOne方法能稍微简单点,不需要遍历即可。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值