Загрузка изображения JSF с кодировкой Base64, сохраненной в базе данных

89
14

Мне нужно загрузить изображение с кодировкой Base64, сохраненным в базу данных на странице JSF с использованием перформансов. Кто-то может вести меня.

Мой метод для скачивания

ByteArrayInputStream bis = new ByteArrayInputStream(Base64.decodeBase64(getCargo().getArquivoDescricao()));
Iterator<?> readers = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = (ImageReader) readers.next();
Object source = bis;
ImageInputStream iis = ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
Image image = reader.read(0, param);
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bufferedImage.createGraphics();
g2.drawImage(image, null, null);
File imageFile = new File(File.separator + "home" + File.separator + "ederson" + File.separator + "Imagens" + File.separator + "sapato.jpg");
ImageIO.write(bufferedImage, "jpg", imageFile);

Мое изображение, сохраненное в базе данных с кодировкой Base64

enter image description here

ОШИБКА

Caused by: javax.imageio.IIOException: Not a JPEG file: starts with 0x75 0xab
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:620)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:347)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:492)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:613)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1070)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1050)
at com.sistema.bean.cadastro.CargoBean.download(CargoBean.java:190)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:181)
at com.sun.el.parser.AstValue.invoke(AstValue.java:289)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
... 84 more

спросил(а) 2020-04-04T00:37:16+03:00 3 месяца назад
1
Решение
54

Пытаться,

String data = "data:image/jpeg;base64,/9...";
String base64Image = data.split(",")[1];
byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image);

BufferedImage img = ImageIO.read(new ByteArrayInputStream(imageBytes));

Или сохраните строку Base64 в базе данных без data:image/jpeg;base64, part.

ответил(а) 2020-04-04T00:57:10.624423+03:00 3 месяца назад
40

Вероятно, вам нужно удалить объявление Base64 в сохраненной строке, так как оно не является частью строки base64, которая должна быть расшифрована.


base64ImageString = imagease64String.replace('data:image/jpeg;base64,',''))

ответил(а) 2020-04-04T00:37:16+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема