Search code examples
phphttp-redirectfile-uploaddrupal-6http-headers

In drupal 6, How to process uloaded file in more than one steps?


I am writing custom module in drupal.
Aim is to :

1. Upload a csv file
2. Display its content in a tabular layout.
3. On confirmation, save it in database.

Problem I am facing:

  1. I am unable to upload any file. I am not getting any thing in $_FILES, even if I upload or not. >> SOLVED
  2. How do I split the process ? Suppose I succeed in uploading file [with your help indeed ;) ], and I save the file, suppose in drupal6/uploaded_data directory. How do I redirect to next page where I can read from file and show tabular data for confirmation.

Codes :)
menu hooks and all

function productsadmin_menu() {
    $items['admin/settings/product-administration'] = array(
        'title' => 'Product Administration',
        'description' => 'Upload products data',
        'page callback' => 'productsadmin_form',
        'access arguments' => array('access content'),
        'type' => MENU_NORMAL_ITEM,
    );
    return $items;
}

function productsadmin_form() {
    return drupal_get_form('productsadmin_my_form');
}

This function is passed to drupal_get_form()

function productsadmin_my_form() {
  $form['#attributes'] = array('enctype' => "multipart/form-data");

  $form['csv'] = array(
    '#type' => 'file',
    '#title' => 'Product Catalog',
    '#description' => 'Product catalog in specified csv format',
    '#required' => FALSE,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
  );
  return $form;
}

Validation (The part which is not working is commented)

function productsadmin_my_form_validate($form, &$form_state) {
    if($form_state['values']['csv'] == "") {
        form_set_error('csv', t('Please input product catalog csv data'));
    }

/*  // Check if file is uploaded (Not working)
    if ($_FILES['files']['name']['csv'] == '') {
        form_set_error('csv', t('Please upload product catalog' . $rahul_vals));
    }
*/
}

Submit action

function productsadmin_my_form_submit($form, &$form_state) {
    /*
        1. Move File to uploaded_dir
        2. Change the header so that it is redirected to new page
    */
}

Solution

  • you shouldn't use $_FILES in drupal,use drupal api

    I made this example for you to explain how to work with cvs

       /**
        * Form function  
        */
         function _form_cvs_import($form_state) {
          $form['#attributes'] = array('enctype' => "multipart/form-data");
          $form['container'] = array(
            '#type' => 'fieldset', 
            '#title' => t('CVS UPLOAD') , 
          );
          $form['container']['cvs_file'] = array(
            '#type' => 'file' ,  
            '#title' => t('CVS FILE') , 
            '#description' => t('insert your cvs file here') , 
          ) ;   
          $form['container']['submit'] = array(
            '#type' => 'submit' ,  
            '#value' => t('SEND') , 
          ) ;       
    
           return $form ; 
        }
    
    /**
    * form validate
    */
    function _form_cvs_import_validate($form, $form_state) {
     $validators = array(
      'file_validate_extensions' => array('cvs'),
     );
     if(!file_save_upload('cvs_file', $validators)) { // the file is not submitted
        form_set_error('cvs_file', 'Please select the cvs file') ;  
     }else{ // the file is submitted another validation for extension
       $file = file_save_upload('cvs_file', $validators, file_directory_path()) ; 
       if($file->filemime != 'application/octet-stream' ) {
         form_set_error('cvs_file', 'Extensions Allowed : cvs') ;       
       }        
     }      
    }
    
    
    /**
    *  form submit
    */
    function _form_cvs_import_submit($form, $form_state) {
        $file = file_save_upload('cvs_file', $validators, file_directory_path()) ;  // this is the cvs file in the tmp directory
        $file_handler = fopen($file->filepath, 'r') ; // open this cvs file
        $line_num = 0 ;
        $fields = array() ;  
        while(!feof($file_handler)) { 
            $line_num++ ; 
            $line = fgets($file_handler) ; // this is the line/row
            $line_array = explode(",", $line);  //  array of row fields
            $field_num = 0 ;  
            foreach($line_array as $field) { 
                $field_num++ ; 
                $fields[$line_num][$field_num] = str_replace('"', '', $field );  // E.g you can access second row and third field by $fields[2][3]
            }   
        }
        fclose($file_handler);
        unlink($file->filepath);
    }