1

私は次のhtmlコードを持っています

<form action="form-handler.php" method="post" enctype="multipart/form-data">
    <div>
            <input id="myfile" name="myfile" type="file">
            <input value="Upload ►" type="submit">
    </div>
</form>

一度に複数のファイルをアップロードしたい。選択したファイルをcodeigniterにアップロードするには、コントローラーで何をすべきですか?Codeigniterファイルアップロードライブラリを使用してみましたが、複数のファイルが読み込まれていません。ただし、1つのファイルの場合は正常に機能しています。

4

1 に答える 1

3

投稿されたファイルの配列を反復処理する foreach ループ内で、Codigniter の do_upload() 関数を呼び出すだけです$_FILE

アップロード フォーム POST を受信するコントローラ関数に入るコードは次のとおりです。

$this->load->library('upload');
$this->upload->initialize($config); //$config is array like as [in CI's documentation][1] 
$path='uploads/some_folder'; // refers to the root's uploads/some_folder folder
$upload_data = $this->upload->multiFileUpload($path, TRUE);

魔法は、私が他の誰かから得た機能multiFileUpload()にあります。この関数は、/application/libraries フォルダー内の MY_Upload.php というファイルに配置することで、CI の Upload ライブラリで拡張されます。

これは MY_Upload.php の内容全体です。これは実際には関数に過ぎないので、ファイルを移動したい場所multiFileUpload()以外は何も知る必要がないので怖がらないでください。$path

<?

class MY_Upload extends CI_Upload {


public function multiFileUpload($path, $protect = FALSE){

  /*
  * Declare uploaded_info and uploaded_files
  * when i'm sure $_FILES has some data
  */
 /* if($this->upload_path[strlen($this->upload_path)-1] != '/')
   $this->upload_path .= '/';*/

   //$this->upload_path=$path;

  if(isset($_FILES)){

   #Here we check if the path exists if not then create
   /*if(!file_exists($this->upload_path)){
    @mkdir($this->upload_path,0700,TRUE);
   }*/

    if(!file_exists($path)){
    @mkdir($path,0700,TRUE);
   }  
    $uploaded_info  = FALSE;
    /*
    * The structure of $_FILES changes a lot with the array name on the input file,
    * then i'm gonna modify $_FILES to make it think the data comes from several
    * input file instead of one "arrayfied" input.
    *
    * The several ways to upload files are controled with this if...else structure
    */
    if(count($_FILES) == 1)
    {
        $main_key = key($_FILES);
        if(is_array($_FILES[$main_key]['name']))
        {

            foreach($_FILES[$main_key] as $key => $value)
            {                

                for($y = 0; $y < count($value); $y++)
                {

                    $_FILES[$main_key .'-'. $y][$key] = $value[$y];

                }


            }

            unset($_FILES[$main_key]);

            $uploaded_files  = $_FILES;
        }
        else
        {
            $uploaded_files  = $_FILES;    
        }

    }
    else
    {
        $uploaded_files  = $_FILES;    
    }

   #Here we create the index file in each path's directory
   /*if($protect){
    $folder = '';
    foreach(explode('/',$this->upload_path)  as $f){

     $folder .= $f.'/';
     $text = "<?php echo 'Directory access is forbidden.'; ?>";

     if(!file_exists($folder.'index.php')){
      $index = $folder.'index.php'; 
      $Handle = fopen($index, 'w');
      fwrite($Handle, trim($text));
      fclose($Handle); 
     }
    }   
   }*/

   #Here we do the upload process

   foreach($uploaded_files as $file => $value){
    if (!$this->do_upload($file))
    {
     $uploaded_info['error'][]  =  array_merge($this->data(),
              array('error_msg' => $this->display_errors()));

    }
    else
    {
     $uploaded_info['upload_data'][] =  array_merge($this->data(),
              array('error_msg' => $this->display_errors()));
    }
   }  
  }

  #Then return what happened with the files
  return $uploaded_info;
 } 
}
于 2013-03-08T00:55:06.027 に答える