この記事では主に 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; $i