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();
}
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();
}
再看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方法能稍微简单点,不需要遍历即可。