通过XML-RPC协议在Java中从Python获取二进制数据(图像文件)

0 投票
1 回答
1138 浏览
提问于 2025-04-18 05:31

我有两个应用程序,一个是用Python写的,另一个是用Java写的。它们通过XML-RPC协议连接在一起。我在数据库中保存了图像文件,存储方式是二进制数据,现在我需要在Java中获取这些图像。

所以我在Python中发起一个查询,获取数据,并返回一个字典,下面是代码:

            aux = {
                    'location_id' : location['id'],
                    'name' : location['name'] or " ",
                    'units' : location['units'] or 0.0,
                    'area' : location['area'] or 0.0,
                    'day_meter' : location['day_meter'] or 0.0,
                    'free' : location['free'] or 0.0,    
                    'type' : location['type'] or " ",
                    'loc_type' : location['loc_type'] or " ",
                    'image' : str(location['image']),                                                                    
               }

在Java中我可以顺利接收到数据,但我无法从二进制数据中获取图像文件。这里是我的代码:

我在Java中进行类型转换,把二进制数据转换成byte []。

        byte[] b = aux.get("image").toString().getBytes("UTF-8");
        l.setByteImg(b);

然后我尝试构建一个BufferedImage。

        InputStream in = new ByteArrayInputStream(l.getByteImg());
        BufferedImage bImageFromConvert = ImageIO.read(in);

但是我得到的bImageFromConvert是null。

我到底哪里做错了呢?

1 个回答

0

XML不支持直接嵌入二进制数据,你需要把它转换成文本字符串。通常我们会用base64来做到这一点。
你可以尝试在Python中对图像数据进行编码,然后在Java中把它转换回二进制流。

Python代码:

aux = {
                    'location_id' : location['id'],
                    'name' : location['name'] or " ",
                    'units' : location['units'] or 0.0,
                    'area' : location['area'] or 0.0,
                    'day_meter' : location['day_meter'] or 0.0,
                    'free' : location['free'] or 0.0,    
                    'type' : location['type'] or " ",
                    'loc_type' : location['loc_type'] or " ",
                    'image' : base64.b64encode(str(location['image'])),                                                                    
               }

Java代码:

byte[] image = javax.xml.bind.DatatypeConverter.parseBase64Binary(aux.get("image").toString());

撰写回答