Масштабировать изображение, затем сохранить в БД (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
Вопрос
Вопрос состоит из двух частей:
- Что я делаю неправильно?
- Есть ли лучший способ масштабировать изображение в 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
в этом случае безопасен, так как строка всегда будет следовать этому шаблону.