2016-04-02 11 views
1

私はajax(旧式のJqueryではなく)を介して複数のファイルをアップロードしています。私は実際にそれが動作するように最終的に管理しました。問題は、システム/ライブラリ/アップロードファイルの行をコメントアウトする必要がありました。これは、問題を修正する推奨方法のようには聞こえません。CodeIgniter 3サポートされていないオペランドタイプin ...システム/ライブラリ/ Upload.php on line 496

行をコメント解除して、upload-> display_errors()を出力すると、Unsupported operand types in...system/libraries/Upload.php on line 496というエラーメッセージが表示されます。システム/ライブラリ/アップロードの

ライン496は、次のとおりです。

// Convert the file size to kilobytes 
    if ($this->file_size > 0) 
    { 
     //$this->file_size = round($this->file_size/1024, 2); 
    } 

:私はこのような行をコメントアウトした場合

// Convert the file size to kilobytes 
    if ($this->file_size > 0) 
    { 
     $this->file_size = round($this->file_size/1024, 2);// <- this line 
    } 

は、私が正しく、エラーやファイルのアップロードを得ることはありませんこれは私の基本的なコントローラーで、 "Uploader"と呼ばれ、CIのLibrary-> Uploadと混同しないようにしました(このクラスをコピーし、何らかの理由で彼のクラスに "Upload"という名前を付けることにしました) "do_upload"は、CodeIgniterがそのuploaに使用する名前なので混乱しますdクラスとdo_upload関数)。あなたが見ることができるように、私は$の設定配列のMAX_SIZEパラメータをコメントアウト:

class Uploader extends CI_Controller { 

function __construct() 
    { 
      parent::__construct(); 
    } 

private $data = array(); 
private $params = array(); 


public function index() 
{ 
    echo "This is the index!"; 
} 


    public function do_upload() 
    { 
     echo "<p>upload controller:</p>"; 
     $config = $this->set_upload_options(); 
     $this->load->library('upload',$config); 

     echo "<pre>"; 
     print_r($_FILES); 

     $files = $_FILES; 
     $cpt = count($_FILES['photos']['name']); 
     $data = array(); 
     $photos = "photos"; 
     for($i=0; $i<$cpt; $i++) 
     {   
      $_FILES['photos']['name']= $files['photos']['name'][$i]; 
      $_FILES['photos']['type']= $files['photos']['type'][$i]; 
      $_FILES['photos']['tmp_name']= $files['photos']['tmp_name'][$i]; 
      $_FILES['photos']['error']= $files['photos']['error'][$i]; 
      $this->upload->initialize($config); 
      if (!$this->upload->do_upload($photos)) { 
       $error = array('error' => $this->upload->display_errors()); 
       foreach($error as $err) 
       { 
        echo "<p>".$err."</p>"; 
       } 
      } 
     } 
     $data['count'] = $i; 
     echo $data['count']; 
     return $data; 

    } 

    private function set_upload_options() 
    { 
     //upload an image options 
     $config = array(); 
     $config['upload_path'] = FCPATH . 'assets_/images/assets/experimental/'; 
     $config['allowed_types'] = 'gif|jpg|png'; 
     //$config['max_size']  = '0'; 
     $config['overwrite']  = TRUE; 

     return $config; 
    } 

}

私はちょうど犬は嘘寝てみましょうべきでしょうか?あるいは、私はただ戻ってきて、私を噛んでしまう可能性のある問題をテーピングしていますか?

UPDATE: 出力に `ます$ this-> FILE_SIZE()のいくつかを試した後、私はそれが配列として渡されていた発見し、その自然配列は、オペランドにすることはできません。

今のところ、system-> libraries->アップロードファイル内のブロックifをこれに変更しました。forループは、$ this-> file_size [$ i]の繰り返しに従って新しい$ this-> file_sizeを割り当てます。ループ。これが答えかもしれませんが、私は他の人が自分の質問に答える前に貢献するために待っています:問題が発生した理由を

 // Convert the file size to kilobytes 
    if ($this->file_size > 0) 
    { 
       if(is_array($this->file_size)){ 
        for($i=0;$i<count($this->file_size);$i++) 
        { 
         $this->file_size[$i] = round($this->file_size[$i]/1024, 2); 
        } 
       }else{ 
        $this->file_size = round($this->file_size/1024, 2); 
       } 
    } 

答えて

0

は、私が知っている、と私はそれを修正するために何をすべきか知っています。この問題は、私の記述「マルチファイルアップロード」の最初の文で示唆されています。

すでに述べたように、「サポートされていないオペランド」は、単純な整数ではなく配列であるfile_size以外のものではありません。それはどのように配列で始めるのですか?

私は、単一のファイルではなく複数の画像ファイルをアップロードしているため、$ _FILESオブジェクトが配列の配列になるので、単純な整数ではなく配列がSystem-> Libraries-> Uploadに渡されますクラス、497のライン494、

if ($this->file_size > 0) 
{ 
     $this->file_size = round($this->file_size/1024, 2); 
} 

$this->file_sizeは、それが簡単なオペランド...の$ this - > FILE_SIZEがサポートされていないオペランドであるもはやだ意味ない配列、になります!

「もちろん、複数のファイルを同時にアップロードしないでください。一度に複数のファイルをアップロードする必要があります。それは要件です。

$this->upload->initialize($this->set_upload_options());行をforループ内で移動して、ファイルごとにアップロード$ configが設定されるようにしましたが、まだこのエラーが発生していました。私は、よりエレガントな解決策がそこにまだあります確信しているが、現在のシステム/ライブラリ/ Upload.phpにライン494から始まるifブロックを変更するための防弾ようだ:

if ($this->file_size > 0) 
    { 
       if(is_array($this->file_size)){ 
        for($i=0;$i<count($this->file_size);$i++) 
        { 
         $this->file_size[$i] = round($this->file_size[$i]/1024, 2); 
        } 
       }else{ 
        $this->file_size = round($this->file_size/1024, 2); 
       } 
    } 

今、あなたは簡単なFILE_SIZEを渡すことができます(複数のファイルをアップロードしようとしたため)配列としてfile_sizeすることもできますが、これはうまくいきます。

そして、あなたの$コンフィグ配列は、それが「0」と0でないなら$config['max_size'] = 0;で0としませ$config['max_size'] = '0';

 private function set_upload_options() 
    { 
     //upload an image options 
     $config = array(); 
     $config['upload_path'] = FCPATH . 'assets_/images/assets/experimental/'; 
     $config['allowed_types'] = 'gif|jpg|png'; 
     $config['max_size']  = 0; 
     $config['overwrite']  = TRUE; 

     return $config; 
    } 

はどうやらそれが適切に評価されません。このようなものを、見えることを確認してください。

0

システム\コア\ common.phpの

function &get_mimes() 
    { 
     static $_mimes; 

     if (empty($_mimes)) 
     { 
      if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) 
      { 
       $_mimes = include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); 
      } 
      elseif (file_exists(APPPATH.'config/mimes.php')) 
      { 
       $_mimes = include(APPPATH.'config/mimes.php'); 
      } 
      else 
      { 
       $_mimes = array(); 
      } 
     } 

     return $_mimes; 
    } 

を確認してくださいCodeIgniterの環境(開発/製造)による(configフォルダに)あなたのmimes.phpを確認してください。あなたの環境フォルダ(Development/Production)でmimes.phpを移動する必要があります。

関連する問題