The original question that Zero Cool asked was "How to attach an image to a node when creating it."
I have not seen it fully respond anywhere, so here is the code that works for me in Drupal 7.27, on Windows 8 :)
The "classified" content type for this node has 3 fields: title, body and field_advert_image (which is only the image field type).
$node = new stdClass(); $node->type = 'classified'; node_object_prepare($node); // Set some default values. $node->language = LANGUAGE_NONE; $node->title = "Test node with image"; $node->body[LANGUAGE_NONE][0]['value'] = strip_tags("<b>Body text example</b>"); $node->body[LANGUAGE_NONE][0]['format'] = 'plain_text'; // or 'full_html' if you want // Get pathauto to generate an URL alias $node->path['pathauto'] = 1; // Created by user 1 $node->uid = 1; // The image directory has to be visible to Drupal on its local file-system, // eg here it would be sites/default/files/adverts $directory_uri = 'public://adverts'; // example image file in that directory: $my_image_file = '32449.jpg'; // First create a file object, and add it to Drupal managed_files table... $file = new stdClass(); $file->filename = $my_image_file; $file->uri = $directory_uri.'/'.$my_image_file; $file->filemime = file_get_mimetype($file->uri); $file->status = FILE_STATUS_PERMANENT; $file->uid = 1; $file = file_save($file); // ...then use the new file object. $node->field_advert_image[LANGUAGE_NONE][0] = (array)$file; node_save($node); // NB node_save() gets the count incremented in the file_managed table; no need to call file_usage_add() if ($node->nid) { echo "- Created node ".$node->nid." ... ".print_r($node,true)."\n"; } else { echo "- Drupal node_save API call failed\n"; }
As you probably guessed, this code is executed from the command line PHP script.
Hope this helps someone.
source share