Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > ms access - image - jsp


Автор: dementiev 9.6.2009, 07:25
Всем привет. Не получается вывести картинку, которая лежит в базе Access в поле "Поле объекта OLE". Там лежит именно картинка, а не путь к ней.
Эти темы просмотрел:
http://forum.vingrad.ru/forum/topic-99699/...mage/index.html
http://forum.vingrad.ru/forum/topic-54327/...mage/index.html),
 вроде сделал так же, но результат нулевой.

Как достаю из БД:
Код

picture.setImage(rs.getObject(4)); //т.е. в классе Picture у меня поле типа Object


код сервлета для передачи картиник на jsp:
Код

request.setAttribute("test", pictureDao.findPictureById(1).getImage());
request.getRequestDispatcher("testPicture.jsp").forward(request, response);


код testPicture.jsp:
Код

<img src="servlet?action=${requestScope.test}">


код сервлета для отображения картинки в response:
Код

String action = request.getParameter("action"); //если здесь вывести action в консоль, по получаю "[B@4a9acb"
byte[] imageContent = action.getBytes();
response.setContentType("image/jpeg");
// записали в выходной поток
response.getOutputStream().write(imageContent);
response.getOutputStream().flush();


Добавлено через 45 секунд
я решал похожую задачу, но тогда содержал в базе пути к картинкам - проблем не было. Здесь надо обязательно держать целую картинку в базе. Подскажите, в чём проблема в примере.

Автор: dementiev 9.6.2009, 16:09
Мне надо хранить в базе сами жпеги, не ссылки. Поле объекта OLE не подходит для этого? Если же подходит, то каким образом из него извлечь жпег, что не так в моём примере? 

Автор: tux 9.6.2009, 16:59
Я видимо не понимаю грандиозности задумки. Зачем вы полученный из запроса параметр:
Код

String action = request.getParameter("action");
byte[] imageContent = action.getBytes();

пишите в респонс в качестве картинки:
Код

response.getOutputStream().write(imageContent);

Насколько я понял нужно писать нечто добытое из базы.

Автор: dementiev 9.6.2009, 20:27
tux, спасибо за отклик.
По вопросу: мне надо в цикле на jsp вывести много объектов, у каждого своя картинка, т.е. нельзя залпом вывести 10 картинок, а надо так:картинка, другие поля объетка, картинка нового объекта.

 Насколько я понял, это такой "стандартный приём", когда сервлету дают в качестве параметра картинку, а он её пишет в респонс.

Мне тут подсказали, что поле ole-db не подходит для этого, надо использовать memo. Вернее сказали, что ole не содержит напрямую jpeg, а надо через сложности его выковыривать(причём библиотеки платные).

По поводу работы jsp и сервлета, я думаю, всё нормально, т.к. таким же образом я выводил картинки (но тогда я знал путь к ней).

Думаю, проблема в том, что я получаю объект из resultSet в object, далее делаю из него string(когда достаю из request), потом делаю у строки .getBytes(). Видимо, где-то в этой цепочке я что-то делаю не так. Что - понять не могу, опыта малоsmile 

Автор: tux 9.6.2009, 20:50
OMG, никогда не думал что такое можно придумать. Что ж все так сложно-то? Тут проблемы практически на каждом этапе.
  • при передаче содержимого поля таблицы в строку драйвер ODBC/JDBC скорее всего будет пытаться перекодировать строку из кодировки базы в юникод. Естественно, что на выходе будет не то изображение. Или совсем не изображение. Строки нельзя использовать для хранения изображений.
  • полученное (скорее всего уже поломатое) изображение передается методом GET в сервлет. Не известно в какой кодировке это делается скорее всего происходит еще одна перекодировка. Хотя картинке это уже не поможет.
Почему не сделать гораздо проще? В сервлет, который выдает изображение, передавать идентификатор из таблицы базы данных. В этом коде '1' похоже и есть этот идентификатор.
Код

request.setAttribute("test", pictureDao.findPictureById(1).getImage());

Сервлет получает этот идентификатор, читает из базы картинку, и пишет в респонс как у вас и сделано. То есть URL будет выглядеть так: 
Код

<img src="servlet?action=1">

Со способом хранения изображений в Access к сожалению не могу помочь, в глаза ее не видел.

Автор: dementiev 9.6.2009, 21:25
намудрил яsmile твой способ гораздо легче.

по поводу access есть БОЛЬШАЯ проблема: blob там нету. Надо использовать "Поле объекта OLE (OLE object)" - а к нему из жавы очень муторный подход. Надо использовать jni вроде бы.

Автор: tux 9.6.2009, 21:41
Цитата(dementiev @  9.6.2009,  21:25 Найти цитируемый пост)
по поводу access есть БОЛЬШАЯ проблема: blob там нету.

А просто какого-нить байтового массива нет? Здесь вроде удалось сохранить и получить - http://forums.sun.com/thread.jspa?threadID=722827. Хотя гораздо лучше конечно хранить изображения в файловой системе, тем более когда имеешь дело с Access.

Автор: dementiev 9.6.2009, 22:31
спасибо огромное. я ,честно, рыл много, этой ссылки не нашёл :(
Это увеличит мой сон с 2х до нормальных 8ми часовsmile
А access, т.к. это курсовой, преподаватели часто оторваны от жизни, зато с принципами по выполнению тз smile
Завтра обязательно отпишу, получилось ли.

Автор: dementiev 17.6.2009, 19:11
Сделал по этому примеру http://forums.sun.com/thread.jspa?threadID=722827
В access создал поле типа ole db. Считывал и записывал двоичные данные, и в БД уже писался тип поля не как OLE DB, а как "Двоичные данные". Т.е. наверняка вообще неважно было, какого типа я создаю поле в access(типа "Двоичные данные" в конструкторе нетуsmile)
Если добавлять картинки через интерфейс access`a, то при считывании были проблемы(вернее, картинки не отображались). Пэтому и запись, и считывание - только программно.
tux, ещё раз спасибо тебе. Вопрос решён. Поставьте, пожалуйста, тюксу за меня плюсик. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)