Community Documentation

Upload multiple images into multiple nodes in one go

Last updated March 27, 2011. Created by SpudEater on June 27, 2009.
Edited by silverwing. Log in to edit this page.

I made this snippet to simplify upload of thousands of images into 1,500 uc_product nodes.

The product content type contained 16 cck image fields.

The code looks to find a match for the image directory name with the SKU of a product. If it does - it picks up the jpg files within in alphabetical order and creates a file object for each CCK field then updates the node.

Then it moves the file from files/library/*productSKU*/ and into files/product_images/ and attempts to delete the directory.

The updating of the node automatically deletes the current set of attached images in product_images.

It's a total mess - I have NO idea how to make this into a module - but it works and all I have to do is view the page and the code runs!

I thought someone else might find it useful.

<?php
define
( 'BASEURL', '/home/*route to the files directory*/files' );


function
findLibrary($Directory){
$MyDirectory = opendir($Directory) or die('Erreur');
    while(
$Entry = @readdir($MyDirectory)) {
        if(
$Entry != '.' && $Entry != '..'){
        if(
is_dir($Directory.'/'.$Entry)) {
           
$imageDirs[] = $Entry;
        }
                }
    }
 
closedir($MyDirectory);
  return
$imageDirs;
}

$libraries = findLibrary(BASEURL.'/library');

foreach(
$libraries AS $library){   // let's go find the NID
   
if($productNid = get_me_my_nid($library)){
        print
"$library found ($productNid)<br>";
        if(
$newImages = scanLibrary($library)){
           
nodeUpdate($productNid,$newImages);
        }else{
            print
" but there are no images within ";
            if(
rmdirr(BASEURL.'/library/'.$library))  print " so I removed it";
        print
" <br> ";
        }
    }else{
        print
"Unable to locate product $library. Please check the product SKU is the same as the image directory";
        if(
rmdirr(BASEURL.'/library/'.$library))  print " (I've got rid anyway)";
        print
" <br> ";
    }
}

function
scanLibrary($Directory){
   
$MyDirectory = opendir(BASEURL.'/library/'.$Directory) or die('Erreur');
        while(
$Entry = @readdir($MyDirectory)) {
           
$jpg1 = strrpos($Entry, 'jpg');
           
$jpg2 = strrpos($Entry, 'JPG');
            if(
$jpg1 || $jpg2){ // don't go here if it's a directory
           
$newImage[$Entry] = array('id'=>$Entry,'filesize'=>filesize(BASEURL.'/library/'.$Directory.'/'.$Entry), 'filepath'=>'product_images/'.$Entry, 'orgpath'=>'library/'.$Directory.'/'.$Entry);
              }
    }
   
closedir($MyDirectory);
   
asort($newImage);
    return
$newImage;
}

function
get_me_my_nid($param = NULL) {
     
$cond = 'model' ." = '%s'";
     
$arguments[] = $param;
     
$fields = 'nid';
     
$node = db_fetch_object(db_query('SELECT '. $fields .' FROM {uc_products} WHERE '. $cond, $arguments));
      return
$node->nid;
}

function
nodeUpdate($nid,$newImages){
   
$node = node_load($nid);
   
$form_state = array();
   
module_load_include('inc', 'node', 'node.pages');
   
$node = node_load($nid);  // load node # 31
   
$form_state['values']['op'] = t('Save');  // this seems to be a required value

    //clear out the old pictures;

   
$iC = 1;
    foreach(
$newImages as $newImage){

       
$file = $newImage['filepath'];
       
$name = basename($file);
       
$file_obj = new stdClass();
       
$file_obj->filename = $name;
       
$file_obj->filepath = "sites/default/files/".$newImage['filepath'];
       
$file_obj->filemime 'image/jpeg';
       
$file_obj->filesize = $newImage['filesize'];
       
$file_obj->filesource = $name;
       
$file_obj->uid = 1;
       
$file_obj->status = 1;
       
$file_obj->timestamp = time();
       
$file_obj->list = 1;
       
$file_obj->uid = 1;
       
$file_obj->status = 1;
       
$file_obj->data = array();
       
$file_obj->timestamp = time();
       
$file_obj->new = true;

       
drupal_write_record('files', $file_obj);

       
$img = array(
            array(
                 
'fid' => $file_obj->fid,
                 
'filename' => $file_obj->filename,
                 
'filepath' => $file_obj->filepath,
                 
'filesize' => $file_obj->filesize,
                 
'filemime' => $file_obj->filemime,   
                 
'timestamp' => $file_obj->timestamp,
                 
'data' => array('title' => $file_obj->filename, 'description' => '', 'alt'=> ''),
                 
'uid' => 1,
                 
'list' => 1
           
)
          );

   
        if(
$iC <= 9){
           
$nodeName = 'field_image_0'.$iC;
        }else{
           
$nodeName = 'field_image_'.$iC;
        }

       
$node->$nodeName = $img;
       
$form_state['values'][$nodeName] = $img;
       
$iC++;

    }

    for(
$iC; $iC<=16; $iC++){ // clear out the remaining images
       
if($iC <= 9){
           
$nodeName = 'field_image_0'.$iC;
        }else{
           
$nodeName = 'field_image_'.$iC;
        }
       
$node->$nodeName = array (0 => 0);
    }

       
node_save($node);

   
// now move the files into product_images - the originals should have been deleted previously

   
foreach($newImages as $newImage){
       
$move_from_here BASEURL.'/'.$newImage['orgpath'];
       
$move_to_here BASEURL.'/'.$newImage['filepath'];
        if (
file_copy( $move_from_here , $move_to_here, FILE_EXISTS_REPLACE ) ){
           
//print $newImage['id']."<BR>";
       
}
    }

   
$imageBase = explode('/',$newImage['orgpath']);

    if(
rmdirr(BASEURL.'/'.$imageBase[0].'/'.$imageBase[1])){
        print
$imageBase[1]." deleted<BR>";
    }else{
        print
$imageBase[1]." deletion failed (probably permissions problem)<BR>";
    }
}

/**
* Delete a file, or a folder and its contents (recursive algorithm)
*
* @author      Aidan Lister <aidan@php.net>
* @version     1.0.3
* @link        <a href="http://aidanlister.com/repos/v/function.rmdirr.php
" title="http://aidanlister.com/repos/v/function.rmdirr.php
" rel="nofollow">http://aidanlister.com/repos/v/function.rmdirr.php
</a> * @param       string   $dirname    Directory to delete
* @return      bool     Returns TRUE on success, FALSE on failure
*/

function rmdirr($dirname)
{
   
// Sanity check
   
if (!file_exists($dirname)) {
        return
false;
    }

   
// Simple delete for a file
   
if (is_file($dirname) || is_link($dirname)) {
        return @
unlink($dirname);
    }

   
// Loop through the folder
   
$dir = dir($dirname);
    while (
false !== $entry = $dir->read()) {
       
// Skip pointers
       
if ($entry == '.' || $entry == '..') {
            continue;
        }

       
// Recurse
       
rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
    }

   
// Clean up
   
$dir->close();
    return @
rmdir($dirname);
}
?>

Comments

This looks like it could be quite useful

This looks like it could be quite useful for migrating folks into a Drupal/Ubercart setup.

Has anything ever come of it...?

Page status

No known problems

Log in to edit this page

About this page

Drupal version
Drupal 6.x
Audience
Programmers, Site users

Site Building Guide

Drupal’s online documentation is © 2000-2013 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License. Comments on documentation pages are used to improve content and then deleted.
nobody click here