zhangxu-fasu

文件上传就是获取到待上传文件的临时路径,把它移动到服务器下的相应文件夹中。

文件上传,必须在表单中的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文件上传操作使用Think\Upload类,假设前面的表单提交到当前控制器的add方法,我们来看下add方法的实现代码:

    public function add(){
        $upload = new \Think\Upload();// 实例化上传类
        $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 \Think\Upload();
        $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 \Think\Upload();
        $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();
            */

 

分类:

技术点:

相关文章:

  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
  • 2022-01-08
  • 2022-12-23
  • 2022-03-06
猜你喜欢
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
相关资源
相似解决方案