Масштабировать изображение, затем сохранить в БД (Blob)

Я только начал использовать библиотеку imgScalr Image Scaling.

Я могу получить код для масштабирования изображений (я уверен, что это работает).

BufferedImage fullImage = Scalr.resize((BufferedImage) ImageIO.read(imageStream), fullImageSize);
BufferedImage thumbImage = Scalr.resize(fullImage, thumbImageSize);


Предыстория
Это используется в веб-приложении tomcat6. Я передаю изображение на сервлет и считываю его в InputStream с именем imageStream.

До изменения размера / масштабирования изображения я брал этот InputStream и сохранял его в БД (Oracle11+). Blob поле с помощью PreparedStatement, вот так:

PreparedStatement st = con.prepareStatement(SQL);
st.setBlob(1, imageStream);

Это работало нормально, так как я мог сохранить его без проблем и получить его без проблем.


Проблема
Теперь проблема в том, что я масштабирую изображения, которые они конвертируют в BufferedImage который я не могу сохранить непосредственно в БД, используя мой PreparedStatement,

Вместо этого я пытаюсь преобразовать BufferedImage к ByteArrayOutputStream который затем читается в InputStream см. код ниже:

BufferedImage fullImage = Scalr.resize((BufferedImage) ImageIO.read(imageStream), fullImageSize);
BufferedImage thumbImage = Scalr.resize(fullImage, thumbImageSize);

ByteArrayOutputStream fullImageArray = new ByteArrayOutputStream();
ByteArrayOutputStream thumbImageArray = new ByteArrayOutputStream();

ImageIO.write(fullImage, imageMimeType, fullImageArray);
ImageIO.write(thumbImage, imageMimeType, thumbImageArray);

InputStream fullImageStream = new ByteArrayInputStream(fullImageArray.toByteArray());
InputStream thumbImageStream = new ByteArrayInputStream(thumbImageArray.toByteArray());

// DB INITIALISATION STUFF

PreparedStatement st = con.prepareStatement(SQL);
st.setBlob(1, fullImageStream);
st.setBlob(2, thumbImageStream);


Сведения об ошибке
Когда я выполняю заявление, я получаю java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into, Что я знаю, что это явно означает, что я пытаюсь вставить NULL значение в столбце, так что это не проблема.

Проблема в том, что в какой-то момент во время моих преобразований или масштабирования значение изображения теряется, и я получаю null


Вопрос
Вопрос состоит из двух частей:

  1. Что я делаю неправильно?
  2. Есть ли лучший способ масштабировать изображение в Java и сохранить его в поле БД (Blob)?

1 ответ

Решение

Эта проблема была вызвана общеизвестной проблемой Pebcak или, в данном случае, "ошибкой разработчика"!

Для дальнейшего использования я ошибся в том, что использовал неправильный тип изображения для ImageIO.read метод:

Проблематично:
ImageIO.write(fullImage, imageMimeType, fullImageArray);

" imageMimeType "был полный MIME-тип, поэтому в данном случае это был"image/jpg". Это неверно, так как значение должно быть просто"jpg", то есть ImageIO.write() Метод ожидал.

Исправлена:
ImageIO.write(fullImage, imageMimeType.replace("image/", ""), fullImageArray);

Я знаю что replace в этом случае безопасен, так как строка всегда будет следовать этому шаблону.

Другие вопросы по тегам