2012-11-19 69 views
1

我想通过codeigniter上传多个图片并使用下面的库,我的问题是,在选择几个(多个)图片后,它会给出输出(php)中的图像,例如:Multi upload image

如果我选择多图像为:

image1.gif | image2.gif | image3.gif

它只是上传:

image3.gif

在此期间我使用上传图像控制功能foreach,它是没有问题的。

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

<?php 
if (!defined('BASEPATH')) 
    exit('No direct script access allowed'); 

class Multi_upload 
{ 
    function Multi_upload() 
    { 
     //  $CI =& get_instance(); 
    } 

    function go_upload($field = 'userfile') 
    { 
     $CI =& get_instance(); 
     // Is $_FILES[$field] set? If not, no reason to continue. 
     if (!isset($_FILES[$field]['name'][0])) { 
      $CI->upload->set_error('upload_no_file_selected'); 
      return FALSE; 
     } else { 
      $num_files = count($_FILES[$field]['name']) - 1; 
      $file_list = array(); 
      $error_hold = array(); 
      $error_upload = FALSE; 
     } 

     // Is the upload path valid? 
     if (!$CI->upload->validate_upload_path()) { 
      // errors will already be set by validate_upload_path() so just return FALSE 
      return FALSE; 
     } 

     for ($i = 0; $i < $num_files; $i++) { 
      //   $fname = $_FILES[$field]['name'][$i]; 
      //   echo "$fname\n\n<br><br>\n\n"; 

      $error_hold[$i] = FALSE; 

      // Was the file able to be uploaded? If not, determine the reason why. 
      if (!is_uploaded_file($_FILES[$field]['tmp_name'][$i])) { 
       $error = (!isset($_FILES[$field]['error'][$i])) ? 4 : $_FILES[$field]['error'][$i]; 

       switch ($error) { 
        case 1: // UPLOAD_ERR_INI_SIZE 
         $error_hold[$i] = 'upload_file_exceeds_limit'; 
         break; 
        case 2: // UPLOAD_ERR_FORM_SIZE 
         $error_hold[$i] = 'upload_file_exceeds_form_limit'; 
         break; 
        case 3: // UPLOAD_ERR_PARTIAL 
         $error_hold[$i] = 'upload_file_partial'; 
         break; 
        case 4: // UPLOAD_ERR_NO_FILE 
         $error_hold[$i] = 'upload_no_file_selected'; 
         break; 
        case 6: // UPLOAD_ERR_NO_TMP_DIR 
         $error_hold[$i] = 'upload_no_temp_directory'; 
         break; 
        case 7: // UPLOAD_ERR_CANT_WRITE 
         $error_hold[$i] = 'upload_unable_to_write_file'; 
         break; 
        case 8: // UPLOAD_ERR_EXTENSION 
         $error_hold[$i] = 'upload_stopped_by_extension'; 
         break; 
        default: 
         $error_hold[$i] = 'upload_no_file_selected'; 
         break; 
       } 

       return FALSE; 
      } 

      // Set the uploaded data as class variables 
      $CI->upload->file_temp = $_FILES[$field]['tmp_name'][$i]; 
      $CI->upload->file_name = $CI->upload->file_name = $_FILES[$field]['name'][$i]; 
      $CI->upload->file_size = $_FILES[$field]['size'][$i]; 
      $CI->upload->file_type = preg_replace("/^(.+?);.*$/", "\\1", $_FILES[$field]['type'][$i]); 
      $CI->upload->file_type = strtolower($CI->upload->file_type); 
      $CI->upload->file_ext = $CI->upload->get_extension($_FILES[$field]['name'][$i]); 

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

      // Is the file type allowed to be uploaded? 
      if (!$CI->upload->is_allowed_filetype()) { 
       $error_hold[$i] = 'upload_invalid_filetype'; 
      } 

      // Is the file size within the allowed maximum? 
      if (!$CI->upload->is_allowed_filesize()) { 
       $error_hold[$i] = 'upload_invalid_filesize'; 
      } 

      // Are the image dimensions within the allowed size? 
      // Note: This can fail if the server has an open_basdir restriction. 
      if (!$CI->upload->is_allowed_dimensions()) { 
       $error_hold[$i] = 'upload_invalid_dimensions'; 
      } 

      // Sanitize the file name for security 
      $CI->upload->file_name = $CI->upload->clean_file_name($CI->upload->file_name); 

      // Remove white spaces in the name 
      if ($CI->upload->remove_spaces == TRUE) { 
       $CI->upload->file_name = preg_replace("/\s+/", "_", $CI->upload->file_name); 
      } 

      /* 
      * Validate the file name 
      * This function appends an number onto the end of 
      * the file if one with the same name already exists. 
      * If it returns false there was a problem. 
      */ 
      $CI->upload->orig_name = $CI->upload->file_name; 

      if ($CI->upload->overwrite == FALSE) { 
       $CI->upload->file_name = $CI->upload->set_filename($CI->upload->upload_path, $CI->upload->file_name); 

       if ($CI->upload->file_name === FALSE) { 
        $error_hold[$i] = TRUE; 
       } 
      } 

      /* 
      * Move the file to the final destination 
      * To deal with different server configurations 
      * we'll attempt to use copy() first. If that fails 
      * we'll use move_uploaded_file(). One of the two should 
      * reliably work in most environments 
      */ 
      if ([email protected]($CI->upload->file_temp, $CI->upload->upload_path . $CI->upload->file_name)) { 
       if ([email protected]_uploaded_file($CI->upload->file_temp, $CI->upload->upload_path . $CI->upload->file_name)) { 
        $error_hold[$i] = 'upload_destination_error'; 
       } 
      } 

      /* 
      * Run the file through the XSS hacking filter 
      * This helps prevent malicious code from being 
      * embedded within a file. Scripts can easily 
      * be disguised as images or other file types. 
      */ 
      if ($CI->upload->xss_clean == TRUE) { 
       $CI->upload->do_xss_clean(); 
      } 

      if ($error_hold[$i]) { 
       $error_upload = TRUE; 

       //    echo $error_hold[$i]; 
      } else { 
       if ($imageVar = $this->multiple_image_properties($CI->upload->upload_path . $CI->upload->file_name)) { 
        $file_list[] = array(
         'name' => $CI->upload->file_name, 
         'file' => $CI->upload->upload_path . $CI->upload->file_name, 
         'size' => $CI->upload->file_size, 
         'ext' => $CI->upload->file_ext, 
         'image_type' => $imageVar->image_type, 
         'height' => $imageVar->height, 
         'width' => $imageVar->width 
        ); 
       } else { 
        $file_list[] = array(
         'name' => $CI->upload->file_name, 
         'file' => $CI->upload->upload_path . $CI->upload->file_name, 
         'size' => $CI->upload->file_size, 
         'type' => $CI->upload->file_type, 
         'ext' => $CI->upload->file_ext 
        ); 
       } 
      } 

      // For debugging 


      //if (strlen($error_hold[$i]) > 1) { 
      //print_r($error_hold); 
      //} 

     } // end for loop 

     // Add error display for individual files   
     if ($error_upload) { 
      $this->set_error($error_hold); 
      return FALSE; 
     } else { 
      return $file_list; 
     } 
    } 

    // -------------------------------------------------------------------- 

    /** 
    * Set Image Properties 
    * 
    * Uses GD to determine the width/height/type of image 
    * 
    * @access public 
    * @param string 
    * @return void 
    */ 
    function multiple_image_properties($path = '') 
    { 
     $CI =& get_instance(); 
     if (!$CI->upload->is_image()) { 
      return false; 
     } 

     if (function_exists('getimagesize')) { 
      if (FALSE !== ($D = @getimagesize($path))) { 
       $types = array(
        1 => 'gif', 
        2 => 'jpeg', 
        3 => 'png' 
       ); 

       $image->width  = $D['0']; 
       $image->height  = $D['1']; 
       $image->image_type = (!isset($types[$D['2']])) ? 'unknown' : $types[$D['2']]; 

       return $image; 
      } 
     } 
    } 

    // -------------------------------------------------------------------- 

    /** 
    * Set an error message 
    * 
    * @access public 
    * @param string 
    * @return void 
    */ 
    function set_error($msg) 
    { 
     $CI =& get_instance(); 
     $CI->lang->load('upload'); 

     if (is_array($msg)) { 
      foreach ($msg as $val) { 
       $msg    = ($CI->lang->line($val) == FALSE) ? $val : $CI->lang->line($val); 
       $this->error_msg[] = $msg; 
       log_message('error', $msg); 
      } 
     } else { 
      $msg    = ($CI->lang->line($msg) == FALSE) ? $msg : $CI->lang->line($msg); 
      $this->error_msg[] = $msg; 
      log_message('error', $msg); 
     } 
    } 

    // -------------------------------------------------------------------- 
} 
?> 

我们该如何解决这个问题?

回答

0

一个整洁的方法,它能够不需要任何额外的库将this piece of codemultiple=""属性在一起。

不要低估通过UI一次选择多个文件的舒适度。

0

请看下面的代码,我想你想要这个。

每次你想要上传一个新文件,你需要初始化每个文件的配置到$ this-> upload-> initialize($ config);

// Has the form been posted? 
if (isset($_POST['submit'])) 
{ 
    // Load the library - no config specified here 
    $this->load->library('upload'); 

    // Check if there was a file uploaded - there are other ways to 
    // check this such as checking the 'error' for the file - if error 
    // is 0, you are good to code 
    if (!empty($_FILES['userfile']['name'])) 
    { 
     // Specify configuration for File 1 
     $config['upload_path'] = 'uploads/'; 
     $config['allowed_types'] = 'gif|jpg|png'; 
     $config['max_size'] = '100'; 
     $config['max_width'] = '1024'; 
     $config['max_height'] = '768';  

     // Initialize config for File 1 
     $this->upload->initialize($config); 

     // Upload file 1 
     if ($this->upload->do_upload('userfile')) 
     { 
      $data = $this->upload->data(); 
     } 
     else 
     { 
      echo $this->upload->display_errors(); 
     } 

    } 

    // Do we have a second file? 
    if (!empty($_FILES['userfile1']['name'])) 
    { 
     // Config for File 2 - can be completely different to file 1's config 
     // or if you want to stick with config for file 1, do nothing! 
     $config['upload_path'] = 'uploads/dir2/'; 
     $config['allowed_types'] = 'gif|jpg|png'; 
     $config['max_size'] = '100'; 
     $config['max_width'] = '1024'; 
     $config['max_height'] = '768'; 

     // Initialize the new config 
     $this->upload->initialize($config); 

     // Upload the second file 
     if ($this->upload->do_upload('userfile1')) 
     { 
      $data = $this->upload->data(); 
     } 
     else 
     { 
      echo $this->upload->display_errors(); 
     } 

    } 
} 
else 
{ 
    $this->load->view("upload_form"); 
} 
0

你也应该尝试这个惊人的库多上传功能。令人惊叹的界面和快速的性能。

http://www.plupload.com/