2011-12-04 18 views
15

私のCodeIgniterプロジェクトでは、プロジェクトの作成中にファイルをアップロードしています。CodeIgniterで複数のファイルをアップロード

function uploadFiles(){ 

    $this->load->library('upload'); 
    $error = 0;  
    $projectName = $_POST['projectname']; 
    mkdir('./uploads/'.$projectName); 

    for($i=0; $i<count($_FILES); $i++) 
    { 

     $_FILES['userfile']['name'] = $_FILES['files']['name'][$i]; 
     $_FILES['userfile']['type'] = $_FILES['files']['type'][$i]; 
     $_FILES['userfile']['tmp_name'] = $_FILES['files']['tmp_name'][$i]; 
     $_FILES['userfile']['error']  = $_FILES['files']['error'][$i]; 
     $_FILES['userfile']['size'] = $_FILES['files']['size'][$i]; 

     $config['upload_path'] = './uploads/'.$projectName; 
     $config['allowed_types'] = 'xml|etl'; 
     $config['max_size']  = '0'; 
     $config['overwrite']  = TRUE; 

     $this->upload->initialize($config); 

     if($this->upload->do_upload()) 
     { 
     $error += 0; 
     }else{ 
     $error += 1; 
     } 
    } 

    if($error > 0){ return FALSE; }else{ return TRUE; } 

} 

そして、私はこのようなCREATE_PROJECT機能でこの関数を呼び出します:ここではアップロード機能です

public function create_project() { 
    $this->load->library('form_validation'); 

    $this->form_validation->set_rules('projectname', 'Project name', 'required'); 

    $this->form_validation->set_message('required', 'This is an obligatory field'); 

    if($this->form_validation->run() == FALSE) { 
     $this->load->view('project_creation_view'); 
    } else { 
     $this->load->model('Project_management_model'); 
     $this->Project_management_model->create_project(); 
     $this->uploadFiles(); 
    } 
} 

しかし、これは何もしません。ファイルはアップロードされていません。空のディレクトリも作成されていません。誰かがエラーを見つけるのを助けることができますか?

ありがとうございました。

+0

チェックページroytuts.com/codeigniter-multiple-files-upload/ – user3470953

答えて

20

あなたが任意の数のファイルをアップロードすることができます。..

$config['upload_path'] = 'upload/Main_category_product/'; 
$path=$config['upload_path']; 
$config['allowed_types'] = 'gif|jpg|jpeg|png'; 
$config['max_size'] = '1024'; 
$config['max_width'] = '1920'; 
$config['max_height'] = '1280'; 
$this->load->library('upload', $config); 

foreach ($_FILES as $fieldname => $fileObject) //fieldname is the form field name 
{ 
    if (!empty($fileObject['name'])) 
    { 
     $this->upload->initialize($config); 
     if (!$this->upload->do_upload($fieldname)) 
     { 
      $errors = $this->upload->display_errors(); 
      flashMsg($errors); 
     } 
     else 
     { 
      // Code After Files Upload Success GOES HERE 
     } 
    } 
} 
+1

ファイル数の設定はありますか?私はcodeigniterコードで20個しかアップロードできませんでしたが、それほど違いはありません。 – jason

+0

'$ this-> upload-> initialize()'のために+1しました。 – Jonah

+4

エラーが出ました。is_uploaded_file()はパラメータ1が文字列であると想定しています。 – zoom

0

私はあなたがこれを逃したと思う:

 
$config['file_name']  = 'somename_'.$i; 
$config['upload_path'] = './uploads/'.$projectName; 
... 
+0

ありがとうございました。しかし、それは役に立たなかった。 – cycero

2

は、これは私が、複数のファイルをアップロードするだけでMY_Upload.phpファイルにこれをコピーするように変更CI_Uploadクラスを拡張したものです。また、ディレクトリも作成します。

http://pastebin.com/g9J6RxW1

その後、あなたはコントローラ機能に必要なことは、フィールドの名前とキーが配列のキーであり、コンフィグデータである配列、にファイルを配置しています。あなたには、このような場合何か:すべてのファイルのコンフィグがちょうどこれを設定するためのループを作る同じであれば

$project_files['files'][0] = array(
      'upload_path' => './uploads/'.$projectName.'/', 
      'max_size' => 0, 
      'allowed_types' => 'xml|etl', 
      'overwrite' => TRUE, 
      'remove_spaces' => TRUE, 
     ); 
$project_files['files'][1] = array(
      'upload_path' => './uploads/'.$projectName.'/', 
      'max_size' => 0, 
      'allowed_types' => 'xml|etl', 
      'overwrite' => TRUE, 
      'remove_spaces' => TRUE, 
     ); 

が、それはまた、「という名前のキー」、すなわちかかります。 $project_files['files']['file_key']

そしてちょうど呼び出す:

if($this->upload->upload_files($project_files)){/*all files uploaded successfully*/} 
0

思想は、私は前にここにこれとまったく同じ質問を見ました;)

あなたは$エラーをインクリメントしている場合)(の$ this - > upload->はdisplay_errorsを出力してみ変数。それは間違って何が起こったかを正確に伝えます。私のお金が権限にだ...

0

私は、アップロードされたすべてのファイルのファイル情報を返すためにCubedの瞳のMY_uploadを変更しました。データメソッドを呼び出すときには、最後のファイルの情報だけがアクセス可能でした。また、アップローダーのIPアドレスをそのリストに追加しました。

http://pastebin.com/tG8A85gY

これは、次によって利用することができます。

$upload_files = $this->upload->upload_files($project_files); 
if ($upload_files->status == true) 
{ 
$fileInfo = $uploaded_files->file_info; 
} 

は、私は、これはCubedの目には、編集などしたほうが良いだろうが、これが私の最初の投稿です、私は何の評判を持っていません実現。

0

簡単にするために、私はこのCIヘルパーファイルを作成しました。あなたのプロジェクト内のどこでも使用する設定ファイル&からロードすることができます。PNG | | MP4それはちょうど3 patrameters

HTMLファイルオブジェクトの@fileobject =名前

@fileopath =あなたは

@filetypes =デフォルト*、EX-」JPGをアップロードしたいファイルのパスを取ります| pdf '

function fileUploader($fileobject, $filepath = "uploads/", $filetypes = "*"){ 
// retrieve the number of images uploaded; 
$number_of_files = sizeof($_FILES[$fileobject]['tmp_name']); 

// considering that do_upload() accepts single files, we will have to do a small hack so that we can upload multiple files. For this we will have to keep the data of uploaded files in a variable, and redo the $_FILE. 
$files = $_FILES[$fileobject]; 

$errors = array(); 
$file_arr = array(); 
$result = array(); 

// first make sure that there is no error in uploading the files 
for ($k = 0; $k < $number_of_files; $k++) { 
    if ($_FILES[$fileobject]['error'][$k] != 0) $errors[$k][] = 'Couldn\'t upload file ' . $_FILES[$fileobject]['name'][$k]; 
} 
if (sizeof($errors) == 0) { 
    // now, taking into account that there can be more than one file, for each file we will have to do the upload 
    // we first load the upload library 
    $CI =& get_instance(); 

    $CI->load->library('upload'); // load library 

    // next we pass the upload path for the images 
    $config['upload_path'] = FCPATH . $filepath; 
    // also, we make sure we allow only certain type of images 
    $config['allowed_types'] = $filetypes; 
    //$config['max_size'] = (int)(ini_get('upload_max_filesize')); 
    $config['max_size'] = '10000'; 
    $config['overwrite'] = FALSE; 

    for ($i = 0; $i < $number_of_files; $i++) { 
     $_FILES['uploadedimage']['name'] = $files['name'][$i]; 
     $_FILES['uploadedimage']['type'] = $files['type'][$i]; 
     $_FILES['uploadedimage']['tmp_name'] = $files['tmp_name'][$i]; 
     $_FILES['uploadedimage']['error'] = $files['error'][$i]; 
     $_FILES['uploadedimage']['size'] = $files['size'][$i]; 
     //now we initialize the upload library 
     $CI->upload->initialize($config); 
     // we retrieve the number of files that were uploaded 
     if ($CI->upload->do_upload('uploadedimage')) { 
      $imageup = $CI->upload->data(); 
      // print_r($imageup["orig_name"]);die; 
      array_push($file_arr, $imageup["orig_name"]); 
      $result["response"] = "true"; 
      $result["message"] = "Files uploaded successfully."; 
      $result["files"] = $file_arr; 

     } else { 
      $result["response"] = "false"; 
      $result["message"][$i] = $CI->upload->display_errors(); 
     } 
    } 

} else { 
    $result["response"] = "false"; 
    $result["message"] = $errors; 

} 
return $result;} 

テスト済み&実証済み。

1

私の評判のレベルのためにまだコメントできませんが、エラーを引き起こした配列である$ fieldname変数に関する受け入れられた答えの下でZoomがコメントをしました。私はその答えで同じ問題を抱えていて、フォーム上のすべてのファイル入力名に[]を付けることで、phpがそれらの入力を配列変数として受け取ったからです。この問題を解決するには、各ファイルにPHP配列を作成するのではなく、一意の名前を入力するだけです。私がそれをした後、問題は私のために遠ざかり、受け入れられた答えは魅力のように働いた。ちょうど私がこの問題を突き抜けている誰かのために情報を渡すと思った。

+0

各ファイルに固有の名前を入力するのはどういう意味ですか?単一の ''と複数の入力フィールド行を使用することには違いがあります。 1つの入力フィールドで、ファイルブラウザウィンドウから複数のファイルを選択できます。複数の入力フィールドを使用すると、一度に1つのファイルしか選択できません。複数ファイルの選択機能が低下すると思いますが、うまくいくと思います。あなたが何を意味するのか少し説明できますか? – TARKUS

+0

また、 'name = 'files []''も使用していますので、あなたが運転していることを知っています。 Ajaxの呼び出しでは、次のようにファイル[]をループします: 'formData.append( 'date'、document.getElementById( 'date')。value); var ins = document.getElementById( 'files')。files.length;for(var x = 0; x "; print_r($_FILES); echo " ";'上記の回答は私のために働いていないので、まだ間違っています。 :/ – TARKUS

関連する問題