Drupal 7 - Upload Image Programmatically

13,537

Solution 1

Try:

 $validators = array(
    'file_validate_extensions' => array('jpg png gif'),
  );
  //Save file
  if ($file = file_save_upload('icon', $validators, $your_file_destination)) {
    $file_content = file_get_contents($file->filepath);
  }
  else{
    form_set_error('icon', 'Could not upload file.');
  }

Solution 2

I had to do this recently. Here is what I ended up with. Which is to save an image to an image field without using a drupal form.

if(isset($_FILES['image'])){

    $node = node_load($nid);

    //Get the uploaded file from the temp directory.            
    $image = file_get_contents($_FILES['image']['tmp_name']);

    //Create the directory if it does not already exist, otherwise check the permissions
    $directory = 'public://my-image-folder';
    file_prepare_directory($directory, FILE_CREATE_DIRECTORY);

    //Saves a file to the specified destination and creates a database entry.
    $file = file_save_data($image, 'public://my-image-folder/'.$_FILES['image']['name'], FILE_EXISTS_RENAME);

    //Set the file status to permanent so it is not deleted in next cron run
    $file->status = FILE_STATUS_PERMANENT;
    file_save($file);

    //Now we have a saved file and an object for it, just need to add it to the node's image field.
    $node->field_my_image_field[$node->language][0] = (array)$file;

    node_save($node);
}
Share:
13,537
Napoleon
Author by

Napoleon

Updated on June 04, 2022

Comments

  • Napoleon
    Napoleon almost 2 years

    I would like to upload an image in a custom module. The image must be permanently saved and renamed if needed. Later I want to be able to display the image somewhere on my form or wherever I want.

    My current code:

    function my_module_name_new_form()
    {
     ....
    
    $form['icon'] = array
    (
        '#type' => 'file',
        '#title' => t('Icon'),
        '#description' => t('Click "Chose File" to select an image to upload.')
    );
    
     ....
    }
    

    In the submit hook I have:

    // Icon
    $filename = $form_state['values']['icon'];
    $dest = file_build_uri($filename); 
    file_save_data('My data', $dest, FILE_EXISTS_RENAME); 
    

    Nothing happens... I couldn't find any Drupal 7.x compatible modules either that somehow make life easier here.

    Solution:

    //----------------------------
    // Icon
    //----------------------------  
    $dest_dir = file_default_scheme() . '://';// Note: file_directory_path() was removed in Drupal 7.x. // $dest_dir contains the destination directory for the file. 
    
    $validators = array('file_validate_extensions' => array('jpg png gif'));
    
    //Save file
    if ($file = file_save_upload('icon', $validators, $dest_dir))
    {
        $filename = $file->filename;        
        $file_content = file_get_contents($dest_dir.$filename); // Fatal error: Cannot access empty property in C:\xampp\htdocs\drupal\modules\custom\achievements\achievements.module on line 446
    }
    else
    {
        form_set_error('icon', 'Could not upload file.');
    }
    // To display the image: // die('<IMG SRC="'.file_create_url($dest_dir.$filename).'"/>');
    //----------------------------