• 技术文章 >后端开发 >php教程

    php文件上传类与详解(1/2)_PHP教程

    2016-07-20 11:09:22原创336
    php教程 配置中的 upload_tmp_dir 这个参数进行比较,如果文件在这个目录下面,那么 move_uploaded_file 才会进行移动操作。而且这个比较是大小写敏感,/ 在windows 下面也是不一样的。而在php配置文件解析的时候,会调用一个realpath 函数,也就是是说,你在move_uploaded_file 之前,


    必须对$file['tmp_name'] = realpath($file['tmp_name']); realpath 一下。


    还有一种情况,大家要注意,就是 move_uploaded_file 如果配置成一个无法访问的路径,那么你不管怎么处理,move_uploaded_file 总是不能成功移动文件。


    在文件上传的时候,用 move_uploaded_file 这个函数不能移动文件,而用copy 或者 rename 确是可以的。


    我也一直很困惑。在文档上,说的比较模糊,就是 move_uploaded_file 这个函数,加了一步检查,检查这个文件是否是有 http post 上传的,


    下面我在网上找到一个文件上传类

    **文件上传类**/

    class upload_file
    {
    /**声明**/
    var $upfile_type,$upfile_size,$upfile_name,$upfile;
    var $d_alt,$extention_list,$tmp,$arri;
    var $datetime,$date;
    var $filestr,$size,$ext,$check;
    var $flash_directory,$extention,$file_path,$base_directory;
    var $url; //文件上传成功后跳转路径;

    function upload_file()
    {
    /**构造函数**/
    $this->set_url("index.php"); //初始化上传成功后跳转路径;
    $this->set_extention(); //初始化扩展名列表;
    $this->set_size(50); //初始化上传文件kb限制;
    $this->set_date(); //设置目录名称;
    $this->set_datetime(); //设置文件名称前缀;
    $this->set_base_directory("attachmentfile"); //初始化文件上传根目录名,可修改!;
    }

    /**文件类型**/
    function set_file_type($upfile_type)
    {
    $this->upfile_type = $upfile_type; //取得文件类型;
    }

    /**获得文件名**/
    function set_file_name($upfile_name)
    {
    $this->upfile_name = $upfile_name; //取得文件名称;
    }

    /**获得文件**/
    function set_upfile($upfile)
    {
    $this->upfile = $upfile; //取得文件在服务端储存的临时文件名;
    }

    /**获得文件大小**/
    function set_file_size($upfile_size)
    {
    $this->upfile_size = $upfile_size; //取得文件尺寸;
    }

    /**设置文件上传成功后跳转路径**/
    function set_url($url)
    {
    $this->url = $url; //设置成功上传文件后的跳转路径;
    }

    /**获得文件扩展名**/
    function get_extention()
    {
    $this->extention = preg_replace('/.*.(.*[^.].*)*/iu','1',$this->upfile_name); //取得文件扩展名;
    }

    /**设置文件名称**/
    function set_datetime()
    {
    $this->datetime = date("ymdhis"); //按时间生成文件名;
    }

    /**设置目录名称**/
    function set_date()
    {
    $this->date = date("y-m-d"); //按日期生成目录名称;
    }

    /**初始化允许上传文件类型**/
    function set_extention()
    {
    $this->extention_list = "doc|xls|ppt|avi|txt|gif|jpg|jpeg|bmp|png"; //默认允许上传的扩展名称;
    }

    /**设置最大上传kb限制**/
    function set_size($size)
    {
    $this->size = $size; //设置最大允许上传的文件大小;
    }

    /**初始化文件存储根目录**/
    function set_base_directory($directory)
    {
    $this->base_directory = $directory; //生成文件存储根目录;
    }

    /**初始化文件存储子目录**/
    function set_flash_directory()
    {
    $this->flash_directory = $this->base_directory."//m.sbmmt.com/m/".$this->date; //生成文件存储子目录;
    }

    /**错误处理**/
    function showerror($errstr="未知错误!"){
    echo "";
    exit();
    }

    /**跳转**/
    function go_to($str,$url)
    {
    echo "";
    exit();
    }

    /**如果根目录没有创建则创建文件存储目录**/
    function mk_base_dir()
    {
    if (! file_exists($this->base_directory)){ //检测根目录是否存在;
    @mkdir($this->base_directory,0777); //不存在则创建;
    }
    }

    /**如果子目录没有创建则创建文件存储目录**/
    function mk_dir()
    {
    if (! file_exists($this->flash_directory)){ //检测子目录是否存在;
    @mkdir($this->flash_directory,0777); //不存在则创建;
    }
    }

    /**以数组的形式获得分解后的允许上传的文件类型**/
    function get_compare_extention()
    {
    $this->ext = explode("|",$this->extention_list);//以"|"来分解默认扩展名;
    }

    /**检测扩展名是否违规**/
    function check_extention()
    {
    for($i=0;each($this->ext);$i++) //遍历数组;
    {
    if($this->ext[$i] == strtolower($this->extention)) //比较文件扩展名是否与默认允许的扩展名相符;
    {
    $this->check = true; //相符则标记;
    break;
    }
    }
    if(!$this->check){$this->showerror("正确的扩展名必须为".$this->extention_list."其中的一种!");}
    //不符则警告
    }

    /**检测文件大小是否超标**/
    function check_size()
    {
    if($this->upfile_size > round($this->size*1024)) //文件的大小是否超过了默认的尺寸;
    {
    $this->showerror("上传附件不得超过".$this->size."kb"); //超过则警告;
    }
    }

    /**文件完整访问路径**/
    function set_file_path()
    {
    $this->file_path = $this->flash_directory."//m.sbmmt.com/m/".$this->datetime.".".$this->extention; //生成文件完整访问路径;
    }

    /**上传文件**/
    function copy_file()
    {
    if(copy($this->upfile,$this->file_path)){ //上传文件;
    print $this->go_to("文件已经成功上传!",$this->url); //上传成功;
    }else {
    print $this->showerror("意外错误,请重试!"); //上传失败;
    }
    }

    /**完成保存**/
    function save()
    {
    $this->set_flash_directory(); //初始化文件上传子目录名;
    $this->get_extention(); //获得文件扩展名;
    $this->get_compare_extention(); //以"|"来分解默认扩展名;
    $this->check_extention(); //检测文件扩展名是否违规;
    $this->check_size(); //检测文件大小是否超限;
    $this->mk_base_dir(); //如果根目录不存在则创建;
    $this->mk_dir(); //如果子目录不存在则创建;
    $this->set_file_path(); //生成文件完整访问路径;
    $this->copy_file(); //上传文件;
    }

    }

    1 2

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/444804.htmlTechArticlephp教程 配置中的 upload_tmp_dir 这个参数进行比较,如果文件在这个目录下面,那么 move_uploaded_file 才会进行移动操作。而且这个比较是大小写...

    php入门到就业线上直播课:查看学习

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    快捷开发Web应用及小程序:点击使用

    支持亿级表,高并发,自动生成可视化后台。

    专题推荐:php 文件 上传 详解 php 教程 配置 中的 upload tmp dir 这个 参数 进行 比较 如果
    上一篇:linux exec 和 shell_exec函数_PHP教程 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 详解PHP会话如何实现在30分钟后被销毁(附代码实例)• PHP中全面阻止SQL注入式攻击分析小结_PHP教程• 一棵php的类树(支持无限分类)_PHP教程• php 不使用js实现页面跳转_php技巧
    1/1

    PHP中文网