0

0

CodeIgniter多文件上传

PHP中文网

PHP中文网

发布时间:2016-05-25 16:59:59

|

1169人浏览过

|

来源于php中文网

原创

codeigniter多文件上传


     * @link        https://github.com/stvnthomas/CodeIgniter-2.1-Multi-Upload
     */
        class MY_Upload extends CI_Upload {
 
 
            /**
             * Properties
             */
                protected $_multi_upload_data           = array();
                protected $_multi_file_name_override    = "";
 
 
            /**
             * Initialize preferences
             *
             * @access  public
             * @param   array
             * @return  void
             */
                public function initialize($config = array()){
                    //Upload default settings.
                    $defaults = array(
                                    "max_size"          => 0,
                                    "max_width"         => 0,
                                    "max_height"        => 0,
                                    "max_filename"      => 0,
                                    "allowed_types"     => "",
                                    "file_temp"         => "",
                                    "file_name"         => "",
                                    "orig_name"         => "",
                                    "file_type"         => "",
                                    "file_size"         => "",
                                    "file_ext"          => "",
                                    "upload_path"       => "",
                                    "overwrite"         => FALSE,
                                    "encrypt_name"      => FALSE,
                                    "is_image"          => FALSE,
                                    "image_width"       => "",
                                    "image_height"      => "",
                                    "image_type"        => "",
                                    "image_size_str"    => "",
                                    "error_msg"         => array(),
                                    "mimes"             => array(),
                                    "remove_spaces"     => TRUE,
                                    "xss_clean"         => FALSE,
                                    "temp_prefix"       => "temp_file_",
                                    "client_name"       => ""
                                );
 
                    //Set each configuration.
                    foreach($defaults as $key => $val){
                        if(isset($config[$key])){
                            $method = "set_{$key}";
                            if(method_exists($this, $method)){
                                $this->$method($config[$key]);
                            } else {
                                $this->$key = $config[$key];
                            }
                        } else {
                            $this->$key = $val;
                        }
                    }
 
                    //Check if file_name was provided.
                    if(!empty($this->file_name)){
                        //Multiple file upload.
                        if(is_array($this->file_name)){
                            //Clear file name override.
                            $this->_file_name_override = "";
 
                            //Set multiple file name override.
                            $this->_multi_file_name_override = $this->file_name;
                        //Single file upload.
                        } else {
                            //Set file name override.
                            $this->_file_name_override = $this->file_name;
 
                            //Clear multiple file name override.
                            $this->_multi_file_name_override = "";
                        }
                    }
                }
 
 
            /**
             * File MIME Type
             * 
             * Detects the (actual) MIME type of the uploaded file, if possible.
             * The input array is expected to be $_FILES[$field].
             * 
             * In the case of multiple uploads, a optional second argument may be
             * passed specifying which array element of the $_FILES[$field] array
             * elements should be referenced (name, type, tmp_name, etc).
             *
             * @access  protected
             * @param   $file   array
             * @param   $count  int
             * @return  void
             */
                protected function _file_mime_type($file, $count=0){
                    //Mutliple file?
                    if(is_array($file["name"])){
                        $tmp_name = $file["tmp_name"][$count];
                        $type = $file["type"][$count];
                    //Single file.
                    } else {
                        $tmp_name = $file["tmp_name"];
                        $type = $file["type"];
                    }
 
                    //We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii).
                    $regexp = "/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/";
 
                    /* Fileinfo Extension - most reliable method.
                     * 
                     * Unfortunately, prior to PHP 5.3 - it's only available as a PECL extension and the
                     * more convenient FILEINFO_MIME_TYPE flag doesn't exist.
                     */
                        if(function_exists("finfo_file")){
                            $finfo = finfo_open(FILEINFO_MIME);
                            if(is_resource($finfo)){
                                $mime = @finfo_file($finfo, $tmp_name);
                                finfo_close($finfo);
 
                                /* According to the comments section of the PHP manual page,
                                 * it is possible that this function returns an empty string
                                 * for some files (e.g. if they don't exist in the magic MIME database).
                                 */
                                    if(is_string($mime) && preg_match($regexp, $mime, $matches)){
                                        $this->file_type = $matches[1];
                                        return;
                                    }
                            }
                        }
 
               /* This is an ugly hack, but UNIX-type systems provide a "native" way to detect the file type,
              * which is still more secure than depending on the value of $_FILES[$field]['type'], and as it
                 * was reported in issue #750 (https://github.com/EllisLab/CodeIgniter/issues/750) - it's better
                     * than mime_content_type() as well, hence the attempts to try calling the command line with
                     * three different functions.
                     *
                     * Notes:
                     *  - the DIRECTORY_SEPARATOR comparison ensures that we're not on a Windows system
                     *  - many system admins would disable the exec(), shell_exec(), popen() and similar functions
                     *    due to security concerns, hence the function_exists() checks
                     */
                        if(DIRECTORY_SEPARATOR !== "\\"){
                            $cmd = "file --brief --mime ".escapeshellarg($tmp_name)." 2>&1";
 
                            if(function_exists("exec")){
                                /* This might look confusing, as $mime is being populated with all of the output when set in the second parameter.
                                 * However, we only neeed the last line, which is the actual return value of exec(), and as such - it overwrites
                                 * anything that could already be set for $mime previously. This effectively makes the second parameter a dummy
                                 * value, which is only put to allow us to get the return status code.
                                 */
                                    $mime = @exec($cmd, $mime, $return_status);
                                    if($return_status === 0 && is_string($mime) && preg_match($regexp, $mime, $matches)){
                                        $this->file_type = $matches[1];
                                        return;
                                    }
                            }
                        }
 
                        if((bool)@ini_get("safe_mode") === FALSE && function_exists("shell_exec")){
                            $mime = @shell_exec($cmd);
                            if(strlen($mime) > 0){
                                $mime = explode("\n", trim($mime));
                                if(preg_match($regexp, $mime[(count($mime) - 1)], $matches)){
                                    $this->file_type = $matches[1];
                                    return;
                                }
                            }
                        }
 
                        if(function_exists("popen")){
                            $proc = @popen($cmd, "r");
                            if(is_resource($proc)){
                                $mime = @fread($proc, 512);
                                @pclose($proc);
                                if($mime !== FALSE){
                                    $mime = explode("\n", trim($mime));
                                    if(preg_match($regexp, $mime[(count($mime) - 1)], $matches)){
                                        $this->file_type = $matches[1];
                                        return;
                                    }
                                }
                            }
                        }
 
                        //Fall back to the deprecated mime_content_type(), if available (still better than $_FILES[$field]["type"])
                        if(function_exists("mime_content_type")){
                            $this->file_type = @mime_content_type($tmp_name);
                            //It's possible that mime_content_type() returns FALSE or an empty string.
                            if(strlen($this->file_type) > 0){
                                return;
                            }
                        }
 
                        //If all else fails, use $_FILES default mime type.
                        $this->file_type = $type;
                }
 
 
            /**
             * Set Multiple Upload Data
             *
             * @access  protected
             * @return  void
             */
                protected function set_multi_upload_data(){
                    $this->_multi_upload_data[] = array(
                        "file_name"         => $this->file_name,
                        "file_type"         => $this->file_type,
                        "file_path"         => $this->upload_path,
                        "full_path"         => $this->upload_path.$this->file_name,
                        "raw_name"          => str_replace($this->file_ext, "", $this->file_name),
                        "orig_name"         => $this->orig_name,
                        "client_name"       => $this->client_name,
                        "file_ext"          => $this->file_ext,
                        "file_size"         => $this->file_size,
                        "is_image"          => $this->is_image(),
                        "image_width"       => $this->image_width,
                        "image_height"      => $this->image_height,
                        "image_type"        => $this->image_type,
                        "image_size_str"    => $this->image_size_str
                    );
                }
 
 
            /**
             * Get Multiple Upload Data
             *
             * @access  public
             * @return  array
             */
                public function get_multi_upload_data(){
                    return $this->_multi_upload_data;
                }
 
 
            /**
             * Multile File Upload
             *
             * @access  public
             * @param   string
             * @return  mixed
             */
                public function do_multi_upload($field){
                    //Is $_FILES[$field] set? If not, no reason to continue.
                    if(!isset($_FILES[$field])){ return false; }
 
                    //Is this really a multi upload?
                    if(!is_array($_FILES[$field]["name"])){
                        //Fallback to do_upload method.
                        return $this->do_upload($field);
                    }
 
                    //Is the upload path valid?
                    if(!$this->validate_upload_path()){
                        //Errors will already be set by validate_upload_path() so just return FALSE
                        return FALSE;
                    }
 
                    //Every file will have a separate entry in each of the $_FILES associative array elements (name, type, etc).
                    //Loop through $_FILES[$field]["name"] as representative of total number of files. Use count as key in
                    //corresponding elements of the $_FILES[$field] elements.
                    for($i=0; $iset_error("upload_file_exceeds_limit");
                                break;
                                //UPLOAD_ERR_FORM_SIZE
                                case 2:
                                    $this->set_error("upload_file_exceeds_form_limit");
                                break;
                                //UPLOAD_ERR_PARTIAL
                                case 3:
                                    $this->set_error("upload_file_partial");
                                break;
                                //UPLOAD_ERR_NO_FILE
                                case 4:
                                    $this->set_error("upload_no_file_selected");
                                break;
                                //UPLOAD_ERR_NO_TMP_DIR
                                case 6:
                                    $this->set_error("upload_no_temp_directory");
                                break;
                                //UPLOAD_ERR_CANT_WRITE
                                case 7:
                                    $this->set_error("upload_unable_to_write_file");
                                break;
                                //UPLOAD_ERR_EXTENSION
                                case 8:
                                    $this->set_error("upload_stopped_by_extension");
                                break;
                                default:
                                    $this->set_error("upload_no_file_selected");
                                break;
                            }
 
                            //Return failed upload.
                            return FALSE;
                        }
 
                        //Set current file data as class variables.
                        $this->file_temp = $_FILES[$field]["tmp_name"][$i];
                        $this->file_size = $_FILES[$field]["size"][$i];
                        $this->_file_mime_type($_FILES[$field], $i);
                        $this->file_type = preg_replace("/^(.+?);.*$/", "\\1", $this->file_type);
                        $this->file_type = strtolower(trim(stripslashes($this->file_type), '"'));
                        $this->file_name = $this->_prep_filename($_FILES[$field]["name"][$i]);
                        $this->file_ext      = $this->get_extension($this->file_name);
                        $this->client_name   = $this->file_name;
 
                        //Is the file type allowed to be uploaded?
                        if(!$this->is_allowed_filetype()){
                            $this->set_error("upload_invalid_filetype");
                            return FALSE;
                        }
 
                        //If we're overriding, let's now make sure the new name and type is allowed.
                        //Check if a filename was supplied for the current file. Otherwise, use it's given name.
                        if(!empty($this->_multi_file_name_override[$i])){
                            $this->file_name = $this->_prep_filename($this->_multi_file_name_override[$i]);
 
                            //If no extension was provided in the file_name config item, use the uploaded one.
                            if(strpos($this->_multi_file_name_override[$i], ".") === FALSE){
                                $this->file_name .= $this->file_ext;
                            //An extension was provided, lets have it!
                            } else {
                                $this->file_ext = $this->get_extension($this->_multi_file_name_override[$i]);
                            }
 
                            if(!$this->is_allowed_filetype(TRUE)){
                                $this->set_error("upload_invalid_filetype");
                                return FALSE;
                            }
                        }
 
                        //Convert the file size to kilobytes.
                        if($this->file_size > 0){
                            $this->file_size = round($this->file_size/1024, 2);
                        }
 
                        //Is the file size within the allowed maximum?
                        if(!$this->is_allowed_filesize()){
                            $this->set_error("upload_invalid_filesize");
                            return FALSE;
                        }
 
                        //Are the image dimensions within the allowed size?
                        //Note: This can fail if the server has an open_basdir restriction.
                        if(!$this->is_allowed_dimensions()){
                            $this->set_error("upload_invalid_dimensions");
                            return FALSE;
                        }
 
                        //Sanitize the file name for security.
                        $this->file_name = $this->clean_file_name($this->file_name);
 
                        //Truncate the file name if it's too long
                        if($this->max_filename > 0){
                            $this->file_name = $this->limit_filename_length($this->file_name, $this->max_filename);
                        }
 
                        //Remove white spaces in the name
                        if($this->remove_spaces == TRUE){
                            $this->file_name = preg_replace("/\s+/", "_", $this->file_name);
                        }
 
                        /* Validate the file name
                         * This function appends an number onto the end of
                         * the file if one with the same name already exists.
                         * If it returns false there was a problem.
                         */
                            $this->orig_name = $this->file_name;
                            if($this->overwrite == FALSE){
                                $this->file_name = $this->set_filename($this->upload_path, $this->file_name);
                                if($this->file_name === FALSE){
                                    return FALSE;
                                }
                            }
 
                        /* Run the file through the XSS hacking filter
                         * This helps prevent malicious code from being
                         * embedded within a file.  Scripts can easily
                         * be disguised as images or other file types.
                         */
                            if($this->xss_clean){
                                if($this->do_xss_clean() === FALSE){
                                    $this->set_error("upload_unable_to_write_file");
                                    return FALSE;
                                }
                            }
 
                        /* Move the file to the final destination
                         * To deal with different server configurations
                         * we'll attempt to use copy() first.  If that fails
                         * we'll use move_uploaded_file().  One of the two should
                         * reliably work in most environments
                         */
                            if(!@copy($this->file_temp, $this->upload_path.$this->file_name)){
                                if(!@move_uploaded_file($this->file_temp, $this->upload_path.$this->file_name)){
                                    $this->set_error("upload_destination_error");
                                    return FALSE;
                                }
                            }
 
                        /* Set the finalized image dimensions
                         * This sets the image width/height (assuming the
                         * file was an image).  We use this information
                         * in the "data" function.
                         */
                            $this->set_image_properties($this->upload_path.$this->file_name);
 
                        //Set current file data to multi_file_upload_data.
                        $this->set_multi_upload_data();
                    }
 
                    //Return all file upload data.
                    return TRUE;
            }
        }

 以上就是CodeIgniter多文件上传的内容,更多相关内容请关注PHP中文网(www.php.cn)! 

Kimi智能助手
Kimi智能助手

超强AI写作助手,一键总结20w字长文,支持批量文档上传,多端同步内容不怕丢失。论文综述、文档速读、脚本小说创作,统统交给Kimi!实时联网搜索,给你最智能清晰的解答。

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CodeIgniter3(CI3)基础教程(全)
CodeIgniter3(CI3)基础教程(全)

共37课时 | 4.7万人学习

Codeigniter 3 中文开发手册
Codeigniter 3 中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号