使用Base64编码保存到数据库的JSF图像下载

问题描述 投票:0回答:2

我需要在带有primefaces的JSF页面上下载保存到数据库的Base64编码的图像。有人可以指导我。

我的下载方法

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
java jsf primefaces
2个回答
1
投票

尝试,

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,部分。


0
投票

您可能需要删除已保存字符串中的Base64声明,因为它不是需要解码的base64字符串的一部分。

base64ImageString = imagease64String.replace('data:image/jpeg;base64,',''))
© www.soinside.com 2019 - 2024. All rights reserved.