The client has thousands of images, each of which is a (simple) product they want in Magento. Each image is named the associated product’s SKU number with a JPG extension. I began by using a recorded Batch script in Photoshop to resize all the images to reduce filesize and make the image more web-friendly.
The following Ruby script generates a Magento Product CSV file from JPG images in a directory. It is pasted as-is.
#!/bin/env ruby require 'rubygems' require 'csv' require 'htmlentities' require 'uri' def main #Dir.glob("media/products/#{catname}/*").each_with_index do |imgpath, i| # Magento 1.7 CSV product headers csv_headers = '"store" "websites" "attribute_set" "type" "category_ids" "sku" "has_options" "name" "meta_title" "meta_description" "image" "small_image" "thumbnail" "url_key" "url_path" "custom_design" "page_layout" "options_container" "image_label" "small_image_label" "thumbnail_label" "country_of_manufacture" "msrp_enabled" "msrp_display_actual_price_type" "gift_message_available" "price" "special_price" "weight" "msrp" "status" "visibility" "Featured" "Deal" "Hot" "enable_googlecheckout" "tax_class_id" "is_recurring" "description" "short_description" "meta_keyword" "custom_layout_update" "news_from_date" "news_to_date" "special_from_date" "special_to_date" "custom_design_from" "custom_design_to" "qty" "min_qty" "use_config_min_qty" "is_qty_decimal" "backorders" "use_config_backorders" "min_sale_qty" "use_config_min_sale_qty" "max_sale_qty" "use_config_max_sale_qty" "is_in_stock" "low_stock_date" "notify_stock_qty" "use_config_notify_stock_qty" "manage_stock" "use_config_manage_stock" "stock_status_changed_auto" "use_config_qty_increments" "qty_increments" "use_config_enable_qty_inc" "enable_qty_increments" "is_decimal_divided" "stock_status_changed_automatically" "use_config_enable_qty_increments" "product_name" "store_id" "product_type_id" "product_status_changed" "product_changed_websites"' path = "output.csv" open(path, 'w') { |f| f.puts csv_headers } Dir.glob("*.JPG").each_with_index do |imgpath, i| image_name = File.basename(imgpath) image_url = "/#{image_name}" sku = image_name[0,image_name.size-4] name = sku desc_short = sku desc = sku csv = '"default" "base" "Default" "simple" "2" "SKU" "0" "NAME" "META_TITLE" "META_DESC" "IMAGE" "IMAGE" "IMAGE" "url-key-SKU" "url-key-SKU" "" "No layout updates" "Block after Info Column" "" "" "" " " "Use config" "Use config" "No" "1.0000" "China" "1.0000" "" "Enabled" "Catalog, Search" "0" "0" "0" "Yes" "None" "No" "LONG_DESC" "SHORT_DESC" "META_KEYWORDS" "" "" "" "" "" "" "" "10000.0000" "0.0000" "1" "0" "0" "1" "1.0000" "1" "0.0000" "1" "1" "" "" "1" "0" "1" "0" "1" "0.0000" "1" "0" "0" "0" "1" "NAME" "0" "simple" "" ""' csv.gsub!('SKU', sku) csv.gsub!('NAME', name) csv.gsub!('LONG_DESC', desc) csv.gsub!('SHORT_DESC', desc_short) csv.gsub!('META_TITLE', sku) csv.gsub!('META_DESC', sku) csv.gsub!('META_KEYWORDS', sku) csv.gsub!('IMAGE', "#{image_url}") open(path, 'a') { |f| f.puts csv } end p "Finished." end main =begin #require 'yaml' #require 'hpricot' #require 'tempfile' #require 'mechanize' #require 'open-uri' #require 'highline/import' #HighLine.track_eof = false class Importer def initialize CSV.foreach('/Users/bluish/Desktop/export_ish.csv') do |row| p row.inspect end return CSV.open('/Users/bluish/Desktop/export_ish.csv', 'wb') do |csv| p 'injecting csv' csv << ['123', '', '456'] end end end class String def decode HTMLEntities.new(:expanded).decode(self) end def encode #HTMLEntities.new(:expanded).encode(self) URI::escape(self) end end def saveImage(remote_url, thumb_url, dir='./media/import') require 'open-uri' begin base = File.basename(remote_url) img = "#{dir}/#{base}" unless File.exist? img p img open(img, 'wb') do |file| file << open(remote_url).read end end thumb = "#{dir}/thumb-#{base}" unless File.exist? thumb p thumb open(thumb, 'wb') do |file| file << open(thumb_url).read end end p "GOT MEDIA" rescue p "FAILED to grab #{remote_url}" p "or #{thumb_url}" p 'Possible 404? continuing...' end end =end