提问人:Suwandi Cahyadi 提问时间:11/10/2023 更新时间:11/20/2023 访问量:25
Groovy:将 Zip 内容字节转换为字符串
Groovy: Convert Zip content bytes to string
问:
我有这 2 个班级:
第一个类 Message 有一个 getBody 方法,它可以返回我们可以指定的对象(如文档中所示),第二个类 MessageLog 有一个方法 addAttachmentAsString,它将第二个参数作为 String 作为附件的内容。
现在,我在 Message.body 中有一个 Zip 内容,我可以使用 getBody 方法获取字节内容,然后我想传递给第二个类的方法,即 MessageLog.addAttachmentAsString。内容将传递给第二个参数,它只接受 String。
我尝试了以下代码:
messageLog.addAttachmentAsString("attachment_name", message.getBody(String), "application/zip")
但结果是,我可以下载附件,但zip内容已损坏,无法打开。
是否可以在不损坏内容的情况下转换以字节为单位的 zip 内容并传入字符串? 谢谢。
答:
所以 Zip 文件是二进制的。字符串是使用字符编码格式(ASCII、UTF-8、UTF-24 等)对二进制数据的解释,以便可读。并非所有二进制都是字符串,但所有字符串都是二进制的。Zip 文件不能解释为 Strings,因为它们不遵循任何字符编码的规则。
但是,有一种方法可以使用 Base64 编码将二进制数据表示为文本。因此,如果您对 zip 文件附件进行 base64 编码,则可以将其作为字符串返回,但是为了解压缩文件,您需要先解码 base64 以返回二进制文件,然后再解压缩它。
从你的帖子中,你没有提到任何关于电子邮件或 base64 编码的内容,所以很难知道这是否是绊倒你的原因,或者实现该方法的人没有使用 base64,它只是乱码。
如果不将 base64 文件解码回基础二进制文件,则无法读取该文件。以下是 Base64 中的编码和解码示例:
import java.util.zip.*
// create a zip file with one text file inside it.
File zip = new File("output.zip")
zip.withOutputStream { out ->
ZipOutputStream zos = new ZipOutputStream( out )
zos.putNextEntry( new ZipEntry("output.txt"))
zos.write("'ello potato cakes! This is a string we're going to write to the zip file.".getBytes("UTF-8"))
zos.closeEntry()
zos.flush()
zos.close()
}
// Base64 encode the zip file
String base64Zip = zip.bytes.encodeBase64().toString()
println("Encoded zip as base64")
println( base64Zip )
println("Decoding base64")
// read the zip file by first base64 decoding it, and reading it as a ZipInputStream.
new ZipInputStream( new ByteArrayInputStream( base64Zip.decodeBase64() ) ).withStream { zin ->
ZipEntry entry = null
while( (entry = zin.nextEntry) != null ) {
println( entry.name )
ByteArrayOutputStream baos = new ByteArrayOutputStream()
baos << zin
println( baos.toString("UTF-8") )
}
}
评论