Импортировать 150 картинок в базу данных за 3 минуты

Недавно я писал про базу данных с картинками. Может показаться, что занесение в ее графическое поле изображений — утомительный ручной процесс. Однако на самом деле всё сделано за считанные минуты небольшим groovy-скриптом.

Напомню, что координаты объектов на Google-картах были известны. Используя сервис статических карт нужно было оснастить записи картинками. Вот как это сделано:

db = Sql.newInstance('jdbc:hsqldb:file:/path/to/db', 'SA', '', 'org.hsqldb.jdbc.JDBCDriver')

query = 'update name_descr_latlon set "mapimg"=? where "id"=?'

db.eachRow('select "id", "latlon" from name_descr_latlon where not ("latlon" is null) and "mapimg" is null'){ row ->
 println row.id
 url = new URL("http://maps.google.com/staticmap?markers=${row.latlon}&zoom=14&size=420x340")
 baos = new ByteArrayOutputStream()
 stream2stream(url.openStream(), baos)
 ba = baos.toByteArray()
 db.execute(query, [ba, row.id])
}


Задействованный здесь метод stream2stream() я уже публиковал на Мтааламу, но, чтобы далеко не лазить, приведу еще раз:

import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

import groovy.sql.Sql

def stream2stream = {is, os ->
 src  = Channels.newChannel(is);
 dest = Channels.newChannel(os);
 buffer = ByteBuffer.allocateDirect(16 * 1024);
 while (src.read(buffer) != -1) {
  buffer.flip();
  dest.write(buffer);
  buffer.compact();
 }
 buffer.flip();
 while (buffer.hasRemaining())dest.write(buffer);
}


Во избежание злоупотреблений, Google выдает за определенный небольшой промежуток времени не более 50 карт, так что скрипт пришлось запускать 3 раза с небольшими (пара минут) интервалами.
  • +12
  • 15 марта 2011, 10:45
  • yababay
  • 4

База данных с картинками

Понадобилось на скорую руку написать нечто вроде CMS, где главная трудность — заполнение базы данных. Операторам предстоит нудная ручная работа с адресами и телефонами организаций, о которых неизвестно ничего, кроме названия и географических координат. Появилась идея оснастить каждую запись базы данных картинкой, чтобы оператор представлял хотя бы о каком районе идет речь.

В MS-Access вставлять картинки в базу данных можно давно. Оказывается, входящая в состав пакета OpenOffice компонента для ведения баз данных ooBase тоже обладает такой возможностью.



Достаточно в таблице завести поле типа VARBINARY, а в форме сопоставить ему элемент управления «Изображение». Загрузить картинки для каждой записи базы данных можно щелкнув по элементу управления правой кнопкой и выбрав файл. А можно и автоматически, но об этом и других чудесах ooBase чуть позже.
  • +8
  • 13 марта 2011, 21:39
  • yababay
  • 1