ホームページ  >  記事  >  バックエンド開発  >  codeigniter の複数ファイルのアップロードの使用例_PHP チュートリアル

codeigniter の複数ファイルのアップロードの使用例_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:38:58765ブラウズ

この記事では主に codeigniter のマルチファイルアップロードの使用例を紹介しますので、必要な友人は参考にしてください

代コード如下: 0、          "max_width" => 0、          "max_height" => 0、          "max_filename" => 0、          "allowed_types" => 「」、          "file_temp" => 「」、          "ファイル名" => 「」、          "orig_name" => 「」、          "ファイルの種類" => 「」、          "ファイルサイズ" => 「」、          "ファイル拡張子" => 「」、          「アップロードパス」 => 「」、          「上書き」 =>間違い、          "encrypt_name" =>間違い、          "is_image" =>間違い、          "image_width" => 「」、          "画像の高さ" => 「」、          "画像タイプ" => 「」、          "image_size_str" => 「」、          "error_msg" =>配列()、          「マイム」 =>配列()、          "remove_spaces" =>真実、          "xss_clean" =>間違い、          "temp_prefix" => "temp_file_",          "client_name" => 「」         );        //各設定を設定します。      foreach($defaults as $key => $val){       if(isset($config[$key])){        $method = "set_{$key}";        if(method_exists($this, $method)){         $this->$method($config[$key]);        } それ以外 {         $this->$key = $config[$key];        }       } それ以外 {        $this->$key = $val;       }      }        //file_name が指定されたかどうかを確認します。      if(!empty($this->ファイル名)){       //複数のファイルをアップロードします。       if(is_array($this->ファイル名)){        // ファイル名のオーバーライドをクリアします。        $this->_file_name_override = "";          //複数のファイル名の上書きを設定します。        $this->_multi_file_name_override = $this->file_name;       //単一ファイルのアップロード。       } それ以外 {        // ファイル名の上書きを設定します。        $this->_file_name_override = $this->file_name;          //複数のファイル名のオーバーライドをクリアします。        $this->_multi_file_name_override = "";       }      }     }       /**    * ファイルの MIME タイプ     *      * 可能な場合は、アップロードされたファイルの (実際の) MIME タイプを検出します。     * 入力配列は $_FILES[$field] であることが想定されます。     *      * 複数のアップロードの場合、オプションの 2 番目の引数は次のようになります。     * $_FILES[$field] 配列のどの配列要素を指定して渡されます     * 要素は参照される必要があります (name、type、tmp_name など)。     *     * @access 保護されています     * @param $file 配列     * @param $count int     * @return void    */     保護された関数 _file_mime_type($file, $count=0){      //複数のファイル?      if(is_array($file["name"])){       $tmp_name = $file["tmp_name"][$count];       $type = $file["type"][$count];      //単一ファイル。      } それ以外 {       $tmp_name = $file["tmp_name"];       $type = $file["type"];      }        //これは MIME 情報文字列を検証するために必要になります (例: text/plain; charset=us-ascii)。      $regexp = "/^([a-z-]+/[a-z0-9-.+]+)(;s.+)?$/";        /* Fileinfo 拡張子 - 最も信頼性の高い方法。       *        * 残念ながら、PHP 5.3 より前では、PECL 拡張機能としてのみ利用可能です。       * より便利な FILEINFO_MIME_TYPE フラグは存在しません。       */        if(function_exists("finfo_file")){         $finfo = finfo_open(FILEINFO_MIME);        if(is_resource($finfo)){         $mime = @finfo_file($finfo, $tmp_name);         finfo_close($finfo);           /* PHP マニュアル ページのコメント セクションによると、          * この関数は空の文字列を返す可能性があります          * 一部のファイルの場合 (例: マジック MIME データベースに存在しない場合)。          */           if(is_string($mime) && preg_match($regexp, $mime, $matches)){            $this->file_type = $matches[1];           戻る;           }        }        }        /* これは醜いハックですが、UNIX タイプのシステムにはファイル タイプを検出する「ネイティブ」な方法が用意されています。       * $_FILES[$field]['type'] の値に依存するよりも安全です。       * 問題 #750 (https://github.com/EllisLab/CodeIgniter/issues/750) で報告されました - より良いものです       * mime_content_type() も同様であるため、次のようにコマンドラインを呼び出そうとします。       * 3 つの異なる機能。       *       * ノート:       * - DIRECTORY_SEPARATOR の比較により、Windows システム上ではないことが確認されます。       * - 多くのシステム管理者は、exec()、shell_exec()、popen() および同様の関数を無効にします。       * セキュリティ上の懸念があるため、function_exists() チェックが行われます。       */        if(DIRECTORY_SEPARATOR !== "\"){         $cmd = "file --brief --mime ".escapeshellarg($tmp_name)." 2>&1";          if(function_exists("exec")){         /* 2 番目のパラメーターに設定すると $mime にすべての出力が設定されるため、これは混乱するかもしれません。          * ただし、必要なのは最後の行だけです。これは exec() の実際の戻り値であるため、上書きされます。          * 以前に $mime に設定できたもの。これにより、実質的に 2 番目のパラメータがダミーになります。          * 値。戻りステータス コードを取得できるようにするためにのみ設定されます。          */          $mime = @exec($cmd, $mime, $return_status);          if($return_status === 0 && is_string($mime) && preg_match($regexp, $mime, $matches)){           $this->file_type = $matches[1];           戻る;          }        }        }        if((bool)@ini_get("safe_mode") === FALSE && function_exists("shell_exec")){        $mime = @shell_exec($cmd);        if(strlen($mime) > 0){         $mime =explode("n", トリム($mime));         if(preg_match($regexp, $mime[(count($mime) - 1)], $matches)){          $this->file_type = $matches[1];          戻る;         }        }       }         if(function_exists("popopen")){        $proc = @popen($cmd, "r");        if(is_resource($proc)){         $mime = @fread($proc, 512);         @pclose($proc);         if($mime !== FALSE){          $mime =explode("n", トリム($mime));          if(preg_match($regexp, $mime[(count($mime) - 1)], $matches)){           $this->file_type = $matches[1];           戻る;          }         }        }       }         // 使用可能な場合は非推奨の mime_content_type() にフォールバックします (それでも $_FILES[$field]["type"] よりは優れています)       if(function_exists("mime_content_type")){        $this->file_type = @mime_content_type($tmp_name);        //mime_content_type() が FALSE または空の文字列を返す可能性があります。        if(strlen($this->file_type)>0){         戻る;        }       }         //他のすべてが失敗した場合は、$_FILES のデフォルトの MIME タイプを使用します。       $this->file_type = $type;     }        /**    * アップロードデータを複数設定する     *     * @access 保護されています     * @return void    */     保護された関数 set_multi_upload_data(){      $this->_multi_upload_data[] = array(       "ファイル名" => $this->file_name,       "ファイルの種類" => $this->file_type,       "ファイルパス" => $this->upload_path,       "フルパス" => $this->アップロードパス.$this->ファイル名,       "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,       "ファイルサイズ" => $this->file_size,       "is_image" => $this->is_image(),       "image_width" => $this->image_width,       "画像の高さ" => $this->image_height,       "画像タイプ" => $this->image_type,       "image_size_str" => $this->image_size_str      );     }        /**    * 複数のアップロードデータを取得     *     * @アクセスパブリック     * @return 配列    */     パブリック関数 get_multi_upload_data(){      $this->_multi_upload_data を返します;     }        /**    * 複数ファイルのアップロード     *     * @アクセスパブリック     * @パラメータ文字列     * @return 混合    */     パブリック関数 do_multi_upload($field){      //$_FILES[$field]は設定されていますか?そうでなければ、続行する理由はありません。      if(!isset($_FILES[$field])){ return false; }        //これは本当にマルチアップロードですか?      if(!is_array($_FILES[$field]["name"])){       // do_upload メソッドにフォールバックします。       return $this->do_upload($field);      }        //アップロードパスは有効ですか?      if(!$this->validate_upload_path()){       //エラーは validate_upload_path() によってすでに設定されているため、FALSE を返すだけです       FALSEを返します。      }       //すべてのファイルには、$_FILES 連想配列要素 (名前、タイプなど) のそれぞれに個別のエントリがあります。      //ファイルの総数を表すとして $_FILES[$field]["name"] をループします。 count をキー入力として使用する      // $_FILES[$field] 要素の対応する要素。      for($i=0; $iset_error("upload_file_exceeds_limit");         壊す;         //UPLOAD_ERR_FORM_SIZE         ケース 2:          $this->set_error("upload_file_exceeds_form_limit");         壊す;         //UPLOAD_ERR_PARTIAL         ケース 3:          $this->set_error("upload_file_partial");         壊す;         //UPLOAD_ERR_NO_FILE         ケース4:          $this->set_error("upload_no_file_selected");         壊す;         //UPLOAD_ERR_NO_TMP_DIR         ケース6:          $this->set_error("upload_no_temp_directory");         壊す;         //UPLOAD_ERR_CANT_WRITE         ケース7:          $this->set_error("upload_unable_to_write_file");         壊す;         //UPLOAD_ERR_EXTENSION         ケース8:          $this->set_error("拡張子によるアップロード停止");         壊す;         デフォルト:          $this->set_error("upload_no_file_selected");         壊す;        }          //失敗したアップロードを返します。        FALSEを返します。       }         // 現在のファイルデータをクラス変数として設定します。       $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 = strto lower(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;         //そのファイルの種類はアップロードが許可されていますか?       if(!$this->is_allowed_filetype()){        $this->set_error("upload_invalid_filetype");        FALSEを返します。       }         //オーバーライドする場合は、新しい名前と型が許可されていることを確認しましょう。       // 現在のファイルにファイル名が指定されているかどうかを確認します。それ以外の場合は、指定された名前を使用します。       if(!empty($this->_multi_file_name_override[$i])){        $this->file_name = $this->_prep_filename($this->_multi_file_name_override[$i]);          // file_name 構成アイテムに拡張子が指定されていない場合は、アップロードされた拡張子を使用します。        if(strpos($this->_multi_file_name_override[$i], ".") === FALSE){         $this->file_name .= $this->file_ext;        //拡張機能が提供されたので、それを使用しましょう!        } それ以外 {         $this->file_ext = $this->get_extension($this->_multi_file_name_override[$i]);        }         if(!$this->is_allowed_filetype(TRUE)){         $this->set_error("upload_invalid_filetype");         FALSEを返します。        }       }         //ファイルサイズをキロバイトに変換します。       if($this->file_size > 0){        $this->file_size =round($this->file_size/1024, 2);       }         // ファイルサイズは許容最大値内ですか?       if(!$this->is_allowed_filesize()){        $this->set_error("upload_invalid_filesize");        FALSEを返します。       }         //画像のサイズは許容サイズ内ですか?       //注: サーバーに open_basdir 制限がある場合、これは失敗する可能性があります。       if(!$this->is_allowed_dimensions()){        $this->set_error("upload_invalid_dimensions");        FALSEを返します。       }         //セキュリティのためにファイル名をサニタイズします。       $this->file_name = $this->clean_file_name($this->file_name);         // ファイル名が長すぎる場合は切り詰めます       if($this->max_filename>0){        $this->file_name = $this->limit_filename_length($this->file_name, $this->max_filename);       }         // 名前内の空白を削除します       if($this->remove_spaces == TRUE){        $this->file_name = preg_replace("/s+/", "_", $this->file_name);       }         /* ファイル名を検証します        ※この関数は末尾に数字を付加します。        * 同じ名前のファイルがすでに存在する場合は、そのファイル。        ※ false が返された場合は問題があります。        */        $this->orig_name = $this->file_name;        if($this->上書き == FALSE){         $this->file_name = $this->set_filename($this->アップロードパス, $this->file_name);         if($this->file_name === FALSE){          FALSEを返します。         }        }         /* XSS ハッキング フィルターを通してファイルを実行します        * これは、悪意のあるコードの侵入を防ぐのに役立ちます。        * ファイル内に埋め込まれます。  スクリプトは簡単に        * 画像または他のファイルタイプに偽装することはできません。        */        if($this->xss_clean){         if($this->do_xss_clean() === FALSE){          $this->set_error("upload_unable_to_write_file");          FALSEを返します。         }        }         /* ファイルを最終的な宛先に移動します        * 異なるサーバー構成に対処するため        * 最初に copy() を使用してみます。  それが失敗した場合        * move_uploaded_file() を使用します。  2 つのうち 1 つは、        * ほとんどの環境で確実に動作します        */        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("アップロード先_エラー");          FALSEを返します。         }        }         /* 最終的な画像の寸法を設定します        * これは画像の幅/高さを設定します (        ※ファイルはイメージでした)。  この情報を使用します        *「データ」関数内。        */        $this->set_image_properties($this->upload_path.$this->file_name);         //現在のファイルデータをmulti_file_upload_dataに設定します。       $this->set_multi_upload_data();      }        //すべてのファイルアップロードデータを返します。      TRUEを返します。    }   }    

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/733185.html技術記事この記事では主に codeigniter のマルチファイル アップロードの使用例を紹介します。必要な方は次のコードを参照してください。?php if(!define(BASEPATH)){ exit(No direct script access allowed);
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。