2012-03-30 4 views
4

Я пытаюсь загрузить несколько изображений, и у меня установлен плагин jquery, поэтому я могу просматривать несколько файлов и выбирать их.Загрузка нескольких файлов userfile [] array?

Единственная проблема, с которой я сталкиваюсь, - это доступ к массиву файлов в моем контроллере, знает ли кто-нибудь, как я могу это сделать? Благодарю.

вид:

<input type="file" name="userfile[]" id="userfile" class="multi" /> 

ответ

8

У меня была такая же проблема на проекте в прошлом году, после того, как немного поисков я нашел идеальную функцию.

Я не беру на себя ответственность за это, но не могу remmeber, где я нашел его, так что если кто-нибудь знает, пожалуйста, обратитесь к автору.

Убедитесь, что форма имеет файлы с именем, как этот

<input type="file" name="userfile"/> 
<input type="file" name="userfile2" /> 
<input type="file" name="userfile3" /> ..etc 

Или

<input type="file" name="userfile[]" /> 

Функция ..

function multiple_upload($upload_dir = 'uploads', $config = array()) 
{ 
    $files = array(); 

    if(empty($config)) 
    { 
     $config['upload_path'] = '../path/to/file'; 
     $config['allowed_types'] = 'gif|jpg|jpeg|jpe|png'; 
     $config['max_size']  = '800000000'; 
    } 

     $this->load->library('upload', $config); 

     $errors = FALSE; 

     foreach($_FILES as $key => $value) 
     {    
      if(! empty($value['name'])) 
      { 
       if(! $this->upload->do_upload($key)) 
       {           
        $data['upload_message'] = $this->upload->display_errors(ERR_OPEN, ERR_CLOSE); // ERR_OPEN and ERR_CLOSE are error delimiters defined in a config file 
        $this->load->vars($data); 

        $errors = TRUE; 
       } 
       else 
       { 
        // Build a file array from all uploaded files 
        $files[] = $this->upload->data(); 
       } 
      } 
     } 

     // There was errors, we have to delete the uploaded files 
     if($errors) 
     {      
      foreach($files as $key => $file) 
      { 
       @unlink($file['full_path']);  
      }      
     } 
     elseif(empty($files) AND empty($data['upload_message'])) 
     { 
      $this->lang->load('upload'); 
      $data['upload_message'] = ERR_OPEN.$this->lang->line('upload_no_file_selected').ERR_CLOSE; 
      $this->load->vars($data); 
     } 
     else 
     { 
      return $files; 
     } 
    } 

Теперь это было время, так как я использовал так что если вам нужна дополнительная помощь, просто сообщите мне.

+0

Эй, спасибо, мне действительно удалось разобраться ... ура! –

+0

Я ненавижу, что Codeigniter не поддерживает несколько входных файлов, например ''. Это «решение» является фактическим обходным решением. Но я должен сказать, что это решение является одним из лучших. – machineaddict

+0

Привет, я хотел бы спросить, как настроить это, когда мне просто нужно это 1 страница, где также находится моя html-форма. Поэтому я сам представляю свою форму. И какой параметр мне следует передать. Спасибо – propaganja

0

HTML, предоставленный ojjwood выше, создаст несколько полей ввода. Если вы хотите иметь только одно окно ввода, но загружать несколько файлов, вам необходимо включить атрибут multiple="multiple" в ваш элемент <input>. [] в name="userfile[]" позволяет размещенным данным быть массивом, а не только одним значением.

На стороне Codeigniter/PHP вам нужно использовать $_POST['userfile] вместо $this->input->post('userfile') для работы с массивами.

1

Чтобы использовать Jquery множественную загрузку с использованием массива html elements [], разработанный следующим образом в акте приема данных sobrescrevi глобальная переменная $ _FILES PHP, чтобы функция do_upload могла читать позже. см.:

  #copy the original array;    
      $temp_array; 
      foreach($_FILES['fil_arquivo'] as $key => $val) 
      { 
       $i = 0; 
       foreach($val as $new_key) 
       { 
        $temp_array[$i][$key] = $new_key; 
        $i++; 
       } 
       // 
      } 

      $i = 0; 
      foreach($temp_array as $key => $val) 
      { 
       $_FILES['file'.$i] = $val; 
       $i++; 
      } 

      #clear the original array; 
      unset($_FILES['fil_arquivo']); 

      $upload_path = 'media/arquivos'; 

      $config['upload_path'] = $upload_path; 
      $config['allowed_types'] = 'doc|docx|xls|xlsx|ppt|pptx|pdf|txt|jpg|png|jpeg|bmp|gif|avi|flv|mpg|wmv|mp3|wma|wav|zip|rar'; 
      $config['encrypt_name'] = true; 

      $this->upload->initialize($config); 
      foreach($_FILES as $key => $value) 
      {    
       if(! empty($value['name'])) 
       { 
        if($this->upload->do_upload($key)) 
        {           
         $this->upload->data(); 
        } 
       } 
      }