Groovy:如何将Zip字节内容转为String且不损坏压缩文件?
问题解答
不能直接将Zip字节内容转为普通String,因为Zip是二进制数据,而String是基于字符编码的文本序列。直接转换时(比如默认用UTF-8编码),二进制字节中很多值对应不上合法的字符编码,会被替换成占位符(如�),导致原始数据丢失,最终Zip文件损坏。
正确的做法是将Zip字节序列编码为Base64字符串——Base64是专门用来将二进制数据转换成ASCII字符串的编码方式,不会丢失任何原始数据。示例代码如下:
// 获取Zip的字节数组 byte[] zipBytes = message.getBody(byte[].class); // 将字节数组编码为Base64字符串 String base64Zip = Base64.getEncoder().encodeToString(zipBytes); // 传入addAttachmentAsString方法 messageLog.addAttachmentAsString("attachment_name", base64Zip, "application/zip");
注意:下载附件后,需要将Base64字符串解码回字节数组再还原为Zip文件。如果MessageLog的下载逻辑会自动处理Base64解码,直接用上述代码即可;如果不会,需在下载后手动解码。
另外,绝对不要用message.getBody(String.class)直接获取Zip内容,这种方式本质是用默认字符编码把二进制字节转成String,必然会破坏原始数据。
内容的提问来源于stack exchange,提问作者Suwandi Cahyadi
相关产品推荐
相关产品推荐

