文件上传就是获取到待上传文件的临时路径,把它移动到服务器下的相应文件夹中。
文件上传,必须在表单中的form标签中写入:enctype="multipart/form-data" 才可以上传文件,上传文件使用的是文件域,代码为<input type="file" name="file"/>。
下面写出一个简单的文件上传的html代码:
<html> <head><title>用户添加</title></head> <fieldset> <legend><h3>用户添加</h3></legend> <form action="add" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="name"><br><br> <input type="hidden" value="{$row['id']}" name="id"/> 用户密码:<input type="password" name="password"><br><br> 用户头像:<input type="file" name="photo"/><br><br> 邮箱号:<input type="text" name="email"><br><br> 手机号:<input type="text" name="mobile"><br><br> <input type="submit" value="提交"> </fieldset> </form> </html>
页面效果:
接下来就要进行php处理,接值除了文件外,其他项还与之前无区别,例如接用户名代码为:$name = I('post.name');即可。重点来看一下文件的接值
hinkPHP文件上传操作使用ThinkUpload
类,假设前面的表单提交到当前控制器的add方法,我们来看下add方法的实现代码:
public function add(){ $upload = new ThinkUpload();// 实例化上传类 $upload->maxSize = 3145728 ;// 设置附件上传大小 $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型 $upload->rootPath = './Uploads/'; // 设置附件上传根目录 $upload->savePath = ''; // 设置附件上传(子)目录 // 上传文件 $info = $upload->upload(); if(!$info) {// 上传错误提示错误信息 $this->error($upload->getError()); }else{// 上传成功 $this->success('上传成功!'); } }
在上面的上传代码中,我们先实例化ThinkPHP预先封装好的类,然后里面有很多属性我们可以调用,比如说文件大小、文件类型等,我们可以根据需要进行调用赋值,
然后用对象去调用upload()方法,就上传成功了,我们可以打印一下结果。会发现是:Array ( [photo] => Array ( [name] => news2.jpg [type] => image/jpeg [size] => 89326 [key] => photo [ext] => jpg [md5] => 16da768d0f7784af779f81950cc3c598 [sha1] => 8266f8e701f2b0193131aec862c6b2a5224b9664 [savename] => 5d40290308019.jpg [savepath] => 2019-07-30/ ) );里面有很多值,我们就可以根据这些把图片的路径传入数据库。
完整的上传代码:
//添加处理 public function add(){ $upload = new ThinkUpload(); $upload->maxSize = 3145728 ;// 设置附件上传大小 $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型 $upload->rootPath = './Uploads/'; // 设置附件上传根目录 $upload->savePath = ''; // 设置附件上传(子)目录 $info = $upload->upload(); //print_r($info);die(); if($info){ $data['name']=I('post.name'); $data['email']=I('post.email'); $data['mobile']=I('post.mobile'); $data['password']=I('post.password'); $data['time']=time(); $data['status']='1'; //拼接路径 $data['photo']='/Uploads/'.$info['photo']['savepath'].$info['photo']['savename']; $res = D('news'); $row = $res->add($data); //print_r($row);die(); if($row){ $this->success('添加用户信息成功','/index.php/home/index/index',3); }else{ $this->error('添加用户信息失败','/index.php/home/index/index',3); } }else{ //输出上传失败原因 $this->error($upload->getError()); } }
上面我们已经说了,上传成功的结果可以进行打印,由此我们可以判断,上传成功后拼接一下路径存入数据库中即可。
在需要修改图片时,我们还是重新上传一张图片,替换掉原路径即可。
//修改的处理页面 接到新值 并且进行修改处理 public function upd(){ $upload = new ThinkUpload(); $upload->maxSize = 3145728 ;// 设置附件上传大小 $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型 $upload->rootPath = './Uploads/'; // 设置附件上传根目录 $upload->savePath = ''; // 设置附件上传(子)目录 $info = $upload->upload(); if(!empty($info)){ $path='/Uploads/'.$info['photo']['savepath'].$info['photo']['savename']; $data['photo']=$path; } $res = D('news'); $data['name']=I('post.name'); $data['email']=I('post.email'); $data['mobile']=I('post.mobile'); $data['password']=I('post.password'); $data['status']=I('post.status'); $data['time']=time(); $id = I('post.id'); //echo $id; $where = array('id'=>$_POST['id']); $row = $res->where($where)->save($data); if($row) { $this->success('修改用户信息成功','/index.php/home/index/index'); }else{ $this->error('修改用户信息失败','/index.php/home/index/index'); } }
补充点:
1.url的规则
系统默认的规范是根据URL里面的模块名、控制器名来定位到具体的控制器类的,从而执行控制器类的操作方法。
例如:http://www.shop.com/index.php/home/index/index;
http://www.shop.com是配置的域名,index.php是入口文件,home是模块,index是控制器名,index是控制器下的一个方法。
2.不输入入口文件也能访问到的路径
如果想省去入口文件路径,那么在入口文件的同级目录下建立一个重写文件.htaccess即可,里面的代码如下:
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] </IfModule>
3.自动生成模块文件
如果我们想让ThinkPHP帮我们自动生成一个模块文件夹,只需要在入口文件里面加入define('BIND_MODULE','要生成的模块名');然后访问一下入口文件即可。在生成后把该行代码屏蔽掉。
4.查询结果不为自己的所有人的信息 把neq 改为 eq 即查询自己的信息
$res = D('news'); /*查询结果不为自己的所有人的信息 把neq 改为 eq 即查询自己的信息 $data['name']=array('neq',$cookie); $row = $res->where($data)->select(); */