我想一个PNG图像文件为Base64编码转换在Groovy。
这里是我的代码:
ImageFile = new File("D:/DATA/CustomScript/Logo.png").text;
String encoded = ImageFile.getBytes().encodeBase64().toString();
我得到以下结果为:
iVBORw0KGgoAAAANSUhEUgAAAIQAAABPCAIAAAClCfqHAAAABGdBTUEAALE / C / xhBQAAAAlwSFlzAAAOwwAADsMBx2 + oZAAAAQ1JREFUeF7t1KGRgwAURdFVyHQbSwOkKlrIoECDSwusoYgDcz97396Z / 3eGUQxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgzIE2IcxzHP87qu176tJ8T4 / X7Lsuz7fu3b6k1BigEpBqQYP2JAigEpBqQYP2JAigEpBqQYP2JAigEpBqQYP2JAigEpBqQYP2JAigEpBqQYP2JAigEpBqQYP2JAnhNj27ZxHN / V9 / f7vU5385wYn8 / n9XoNwzBN03W6l / P8BwSpsfw4c1 / 6AAAAAElFTkSuQmCC
当通过https://www.base64encode.org/通过了相同的图像给出了这样的结果:
iVBORw0KGgoAAAANSUhEUgAAAIQAAABPCAIAAAClCfqHAAAABGdBTUEAALGPC / xhBQAAAAlwSFlzAAAOwwAADsMBx2 + oZAAAAQ1JREFUeF7t1KGRgwAURdFVyHQbSwOkKlrIoECDSwusoYgDc497396Z / 3eGUQxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgxIMSDFgBQDUgzIE2IcxzHP87qu176tJ8T4 / X7Lsuz7fu3b6k1BigEpBqQYkGJAigEpBqQYkGJAigEpBqQYkGJAigEpBqQYkGJAigEpBqQYkGJAigEpBqQYkGJAigEpBqQYkGJAnhNj27ZxHN / V9 / f7vU5385wYn8 / n9XoNwzBN03W6l / P8BwSpsfw4c1 / 6AAAAAElFTkSuQmCC
我试图强调一些差异。很显然,这两种编码的字符串是不同的。
问题是,我有该图像的Base64编码传递给另一个系统,它是接收来自https://www.base64encode.org/所述一个但拒绝由Groovy的生成的一个。
任何想法,我做错了什么?
您在这里hiting编码问题。二进制数据不是字符数据;字符数据是由编码实现。相反text
的使用文件的bytes
。例如。
def f = "/tmp/screenshot-000.png" as File
assert f.bytes.encodeBase64().toString()==("/tmp/encoded_20190208131326.txt" as File).text
从用户cfrick答案是非常有帮助的。不幸的是,它并没有解决我的问题。我认为主要原因是,我是在一个旧版本的Groovy。
此代码终于解决了我的问题:
String base64Image = "";
File file = new File(imagePath);
FileInputStream imageInFile = new FileInputStream(file);
byte[] imageData = new byte[file.size()];
imageInFile.read(imageData);
base64Image = Base64.getEncoder().encodeToString(imageData);