基于Phalcon的文件上传封装

分享一段在工作中封装的上传文件类库,使用都是非常的方便,好啦,话不多说,直接上代码。

<?php
/**
 * 文件上传
 * User: Kp
 * Date: 2015/11/23
 * Time: 13:48
 */

class Upload{
    // request控制器对象
    private $request;
    // 是否自动创建目录
    private $auto_mkdir = true;
    // 文件上传路径
    private $file_path;
    // 上传文件最大尺寸
    private $file_size;
    // 上传文件的格式限制
    private $file_type;
    // file文件对象
    private $file;
    // 错误信息
    private $error_info;
    // 错误状态,默认无错误
    private $error_state = false;
    // 上传成功后文件真实路径
    private $file_realpath = array();


    public function __construct($request , $file_path , $file_size , $file_type){
        $this->request   = $request;
        $this->file_path = $file_path;
        $this->file_size = $file_size;
        $this->file_type = $file_type;
    }

    /**
     * 获取文件真实保存路径
     * @return array
     */
    public function getFileRealPath(){
        return $this->file_realpath;
    }

    /**
     * 执行上传文件
     * @return bool
     */
    public function uploadfile(){
        // 检测是否有上传文件
        if ($this->request->hasFiles() == true) {
            // 获取上传文件的相关信息
            foreach ($this->request->getUploadedFiles() as $file) {
                $this->file = $file;
                // 检查文件大小
                $this->checkSize();
                // 检查文件类型
                $this->checkType();
                // 移动文件到指定目录
                $this->move();
            }
        }else{
            $this->error_state = true;
            $this->error_info = '暂无上传文件';
        }
    }

    /**
     * 移动文件
     * @return bool
     */
    private function move(){
        if(!$this->error_state){
            // 检查并创建目录
            $this->checkDir();
            // 目录路径
            $filepath = trim($this->file_path , '/') . '/';
            // 生成文件名称
            $filename = $this->getFileName();
            // 移动文件
            if(!$this->file->moveTo($filepath . $filename)){
                $this->error_state = true;
                $this->error_info = '上传文件失败';
            }else{
                $this->file_realpath[] = $filepath . $filename;
            }
        }
    }

    /**
     * 生成文件名规则
     * @return string
     */
    private function getFileName(){
        return date('YmdHis') . uniqid() . '.' . $this->file->getExtension();
    }

    /**
     * 检查并创建目录
     * @return bool
     */
    private function checkDir(){
        if(!$this->error_state){
            if(!is_dir($this->file_path)){
                if($this->auto_mkdir){
                    if(!$this->mkdir($this->file_path)){
                        $this->error_state = true;
                        $this->error_info[] = '目录创建失败';
                    }
                }else{
                    $this->error_state = true;
                    $this->error_info[] = '上传目录不存在';
                }
            }
        }
    }

    /**
     * 检测上传文件的大小
     * @return bool
     */
    private function checkSize(){
        if(!$this->error_state){
            if($this->file->getSize() > $this->file_size){
                $this->error_state = true;
                $this->error_info[] = '上传文件过大';
            }
        }
    }

    /**
     * 递归创建目录
     * @param $dir
     * @return bool
     */
    private function mkdir($dir){
        if(!is_dir($dir)){
            if(!$this->mkdir(dirname($dir))){
                return false;
            }
            if(!mkdir($dir,0777)){
                return false;
            }
        }
        return true;
    }

    /**
     * 检查上传文件类型
     * @return bool
     */
    private function checkType(){
        if(!$this->error_state){
            if(is_array($this->file_type)){
                if(!in_array($this->file->getExtension() , array_map('strtolower' , $this->file_type))){
                    $this->error_state = true;
                    $this->error_info[] = '文件类型错误';
                }
            }else if(is_string($this->file_type)){
                if(strtolower($this->file->getExtension()) != strtolower($this->file_type)){
                    $this->error_state = true;
                    $this->error_info[] = '文件类型错误';
                }
            }else{
                $this->error_state = true;
                $this->error_info[] = '文件类型错误';
            }
        }
    }

    /**
     * 返回错误信息
     * @return mixed
     */
    public function errInfo(){
        return $this->error_info;
    }

    /**
     * 返回错误状态
     * @return bool
     */
    public function errState(){
        return $this->error_state;
    }


}

如何调用上传类呢?
Upload分页一般可以放到library目录中,或者任意注册过的目录中,然后就可以在控制器中直接调用了,调用的示例如下:

/**
 * 图片基础上传控件
 */
public function uploadAction(){
    // 定义上传路径
    $file_savepath = './upload/images/';
    // 定义上传文件的大小
    $file_size = 2 * 1024 * 1024;
    // 定义上传文件的允许类型
    $file_type = array('jpg','png','gif');
    // 上传配置
    $upload = new Upload($this->request , $file_savepath  , $file_size , $file_type);
    // 开始上传
    $upload->uploadfile();
    // 判断上传状态  true标识没有上传成功  false 标识上传成功
    if(!$upload->errState()){
        // 返回文件保存真实路径
        return array(1 , $upload->getFileRealPath());
    }else{
        // 打印错误信息
        return array(0 , $upload->errInfo());
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Phalcon 中文文档 一般都是直接看英文资料,大都能看得懂。但看到Phalcon框架如此优秀,在学习后就想和大家分享,但发现国内的人几乎没有使用的,故想翻译一下,一旦翻译才发现读懂和译出一篇好文章真的不太一样。 故前一期翻译的部分章节有点生硬,等有空的时候再回头重译吧,后面的一部分也是以英文文档为基础,但并不再是逐句翻译了。 09年左右,大量的框架出现,我看过的框架不下20种,最先看到的可能就是php.MVC了,这是一个按照struts 1x编写的,只不过同时加载的类库太多了,效率不高而且不太完善。 后来稍有名的包括 cakephp, Symfony, Akelos, Prado, Kohana等,最近几年流行的就是 zf, yii, ci等,当然还有国内几个比较有名的框架,如fleaphp, thinkphp等。 在上面的一些框架中,我比较感冒的还是ci,yii,thinkphp等。ci,thinkphp够简单,速度也不错。yii是生活在国外的华人开发,功能够全而强大,速度也不错,国内的应用也不少。 一直不太喜欢zf,记得几年前就和同行朋友聊天的时候说,像ZEND公司完全可以用C语言开发出一个扩展来,这样效率会高得多,为毛非得用PHP开发呢,事实被我验证了,但开发扩展的不是ZEND公司,而是国内一个PHP大鸟,人称鸟哥。这个框架就是非常出名的YAF,因此YAF扩展是我必装的扩展之一。同时这也是我发现的第一个C语言写的扩展框架。 但YAF的缺点是,功能非常不完善,在我看来只是简单实现了MVC结构及路由,分发等功能,像一些ORM之类的功能完全没有开发,作者好像也没有开发的意思:) 后来就发现了Phalcon,一看文档就爱上了她,功能,速度等都是我想要的,我花了一周时间看文档学习她,并在一个下午的过程中,发现了文档中的三个错误并提交了这些错误:),我决定为完善它也贡献一点自己的力量。 本文档的中文地址存放在 http://phalcon.5iunix.net Github上的地址为: https://github.com/netstu/phalcondocs ,您如果发现有些地方译的有些操蛋,烦请你fork它,并完善她。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值