ThinkPHP的文件上传类UploadFile.class.php位于ThinkPHPLibORGNet文件内下,其对于文件上传的处理非常的强大和方便。内置的文件上传类UploadFile类提供了下面的功能:

1、上传检测

2、多文件上传

3、自动生成上传图片缩略图

4、支持覆盖方式上传

5、支持上传类型、附件大小、上传路径定义

6、采用IFrame方式的Ajax上传机制支持

7、支持上传文件命名规则

8、支持对上传文件的Hash规则

9、可设置是否保存附件数据到数据库

在上传表单中可以进行很多参数的设置对上传进行灵活的定义,Action类的_upload方法会自动进行相关处理。

要更好的理解上传保存操作,可以参考ThinkPHP的附件数据表结构,更加详细下面的UploadFile类的参数和使用方法可以参考文件上传类的使用。

首先不要忘记对提交表单的form添加enctype=”multipart/form-data”,否则,是无法上传文件的。

<FORM METHOD=POST enctype="multipart/form-data" ACTION="__URL__/insert">
<TABLE>
<TR>
<TD align="right">用户名:</TD>
<TD><INPUT TYPE="text" NAME="name"></TD>
</TR>
<TR>
<TD align="right">密码:</TD>
<TD><INPUT TYPE="password" name="password"></TD>
</TR>
<TR>
<TD align="right">昵称:</TD>
<TD><INPUT TYPE="text" NAME="nickname"></TD>
</TR>
<TR>
<TD align="right">邮箱:</TD>
<TD><INPUT TYPE="text" NAME="email"></TD>
</TR>
<TR>
<TD align="right">头像:</TD>
<TD><INPUT TYPE="file"  name="photo" ></TD>
</TR>
<TR>
<TD align="right"></TD>
<TD><INPUT TYPE="submit" value="注册"></TD>
</TR>
</TABLE>
</FORM>

这里的头像input的name填写可以随意,只要不和其他input冲突就可以,ThinkPHP自己就会检测到的。除非当有多个文件一起上传,并且需要良好的对应关系时,再注意下。

现在,通过以下代码,即可实现保存表单,并保存相应的图片信息。

$usersM = M('user');

$result = $usersM->create();

if ( $result ) {
    if ( empty($result['id']) ) {
        unset($result['id']);
        $return = $usersM ->add($result);
        $id = $return;

    }else {
        $id = $result['id'];
        $return = $usersM ->where( array('id'=>$id) )->save($result);
    }
    if ( $return ) {
        import("ORG.Net.UploadFile");
        $upload = new UploadFile();//实例化上传类
        $upload->maxSize  = 3145728 ; // 设置附件上传大小
        $upload->allowExts  = array('jpg', 'gif', 'png', 'jpeg');//设置上传类型限制
        $upload->savePath =  './Public/Upload/Pics/'; //设置上传路径限制
        $upload->saveRule = time();//保存文件的命名规则,这里以时间戳为文件名
        $result = $upload->upload();//保存上传文件,获取上传信息
        if( !$result ) {
            if ( $upload->getErrorMsg() != '没有选择上传文件') {//这个判断是用户不上传头像时不报错,通过。
                 $this->error($upload->getErrorMsg());
            }                  
        }else {
            $uploadList = $upload->getUploadFileInfo();//获取上传文件成功后的结果
            $savename = $uploadList[0]['savename'];//获取保存的文件名
            $result = $usersM ->where( array('id'=>$id) )->save( array('user_avatar' => $savename ));//更新头像对应的文件名
            if ( !$result ) {
                $this->error($usersM ->getLastSql());
            }                   
        }
        
        $this->success('保存成功!');
        
    }else {
        $this->error('插入数据时出错,请重试。'.$usersM ->getLastSql());
    }
}else {
    $this->error('数据有误,请重试');
}