24533

how can convert $files contain to array?

Question:

How do I solve this error?

A PHP Error was encountered Severity: Warning Message: Invalid argument supplied for foreach() Filename: admin/tour.php Line Number: 81

this is line 81:

$files = $this->multi_upload->go_upload(); var_dump($files); $images = array(); foreach ($files as $img) { //line 81 $images[] = $img['file']; }

this my $files in top code:

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 = $_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 ( ! @copy($CI->upload->file_temp, $CI->upload->upload_path.$CI->upload->file_name)) { if ( ! @move_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; } }

Answer1:

The simple answer is that $files is not an array. foreach only works on arrays. We don't know what the value is, but in any case, it's not right. You'd have to look at the go_upload function to see why it's not doing what you expect.

Answer2:

Actually doing like this you wil get the file or the value you want to.

foreach ($files as $img) { //line 81 echo $img; // echo the Var and you will see.. }

This line -> $files = $this->multi_upload->go_upload(); probably come from a file object in your form, right? Then it must to be named like this file[] and not only file. You need to be specific that it is an Array. Otherwise nothing will happen.

Answer3:

Too avoid seeing this warning message you should count the array:

if (count($files) > 0) { foreach ($files as $img) { //line 81 $images[] = $img['file']; } }

Answer4:

Regarding the 'Invalid argument supplied for foreach()' error this is probably because $files is not an array (or similar). The best way to do this IMHO is:

$files = $this->multi_upload->go_upload(); echo '<pre>'; echo "Files:\n"; print_r($files); echo '</pre>'; $images = array(); foreach ($files as $img) { //this is line 80 $images[] = $img['file']; } if ( ! $files ) { $this->session->set_flashdata('error', $this->upload->display_errors()); redirect('admin/tour/insert_foreign'); }

Please make this change and show us the output.

Answer5:

I figure I would just share how I handle multiple uploads in CI, it's a little different than your method:

Form looks like this:

<?php echo form_open_multipart('upload/multiple_upload');?> <input type="file" name="userfile[]" size="20" /><br /> <input type="file" name="userfile[]" size="20" /><br /> </form>

Upload/multiple_upload function in controller looks like this:

function multiple_upload() { $config['upload_path'] = './userpics/originals/'; // server directory $config['allowed_types'] = 'gif|jpg|png'; // by extension, will check for whether it is an image $config['max_size'] = '512'; // in kb //$config['max_width'] = '1024'; //$config['max_height'] = '768'; $this->load->library('myupload'); $error = array(); $data = array(); for ($i=0;$i<count($_FILES['userfile']['name']);$i++) { $this->myupload->initialize($config); if (!$this->myupload->do_upload('userfile',$i)) { $error[] = $this->myupload->display_errors(); } $data[$i] = $this->myupload->data(); //gradually build up upload->data() } if ( count($error) > 0 ) { print_r($error); } else { print_r($data); } }

At this point I made a copy of CI upload class, and pasted it into my applications library directory. A few changes need to be made. I named it myupload.

@ Line 143:

public function do_upload($field = 'userfile')

change to

public function do_upload($field = 'userfile', $i = 0)

Any lines in this function above line 200, you must add [$i] to the end of the $_FILES variables.

Example:

is_uploaded_file($_FILES[$field]['tmp_name'])

change to:

is_uploaded_file($_FILES[$field]['tmp_name'][$i])

There are 9 lines to be updated.

Answer6:

Are you sure that you get an array? is see several return FALSE. So you should check,

if ($files !== FALSE)

or casting it to an (empty) array (if false returns) with

$files = (array) $this->multi_upload->go_upload();

Recommend

  • Python help to debug an error when modify a file in a stream mode
  • function is_uploaded_file( ) not working .. always returns a false flag
  • How to link app.js to html page,so that I should display the progress bar in the browser using socke
  • Django easy-thumbnails MAX SIZE
  • python read a file, save a new column for each line ad save the same file
  • Python w/Google Drive API
  • handle AVL messages with iodine
  • Multiple SQL query not executing in Cakephp
  • PHP contact form sending email every time the page is refreshed
  • python: subprocess calling a script which runs a background process hanging
  • PHP - filesize() returns an empty string
  • Load LibSVM's Model File in Matlab
  • Can the NTFS $MFT file have child records?
  • Unable to insert array into database
  • Uploader produces errors regarding the column in which it should store the path
  • XSLT removing arbitrary duplicate sibling elements
  • find a file in a nested directory structure
  • Insert Columns between columns in excel
  • ThreadStatic in asynchronous ASP.NET Web API
  • Why HTML5 Canvas with a larger size stretch a drawn line?
  • Spray.io: When (not) to use non-blocking route handling?
  • Modifying destination and filename of gulp-svg-sprite
  • How to extract text from Word files using C#?
  • GridView Sorting works once only
  • Cannot Parse HTML Data Using Android / JSOUP
  • trying to dynamically update Highchart column chart but series undefined
  • How to set the response of a form post action to a iframe source?
  • Java static initializers and reflection
  • embed rChart in Markdown
  • Change div Background jquery
  • Qt: Run a script BEFORE make
  • Are Kotlin's Float, Int etc optimised to built-in types in the JVM? [duplicate]
  • unknown Exception android
  • Does armcc optimizes non-volatile variables with -O0?
  • How to get NHibernate ISession to cache entity not retrieved by primary key
  • reshape alternating columns in less time and using less memory
  • Observable and ngFor in Angular 2
  • How can I use `wmic` in a Windows PE script?
  • Unable to use reactive element in my shiny app
  • Conditional In-Line CSS for IE and Others?