Groovy:将 Zip 内容字节转换为字符串

Groovy: Convert Zip content bytes to string

提问人:Suwandi Cahyadi 提问时间:11/10/2023 更新时间:11/20/2023 访问量:25

问:

我有这 2 个班级:

  1. Message 类
  2. MessageLog 类

第一个类 Message 有一个 getBody 方法,它可以返回我们可以指定的对象(如文档中所示),第二个类 MessageLog 有一个方法 addAttachmentAsString,它将第二个参数作为 String 作为附件的内容。

现在,我在 Message.body 中有一个 Zip 内容,我可以使用 getBody 方法获取字节内容,然后我想传递给第二个类的方法,即 MessageLog.addAttachmentAsString。内容将传递给第二个参数,它只接受 String。

我尝试了以下代码:

messageLog.addAttachmentAsString("attachment_name", message.getBody(String), "application/zip")

但结果是,我可以下载附件,但zip内容已损坏,无法打开。

是否可以在不损坏内容的情况下转换以字节为单位的 zip 内容并传入字符串? 谢谢。

字符串 groovy zip 字节

评论


答:

0赞 chubbsondubs 11/12/2023 #1

所以 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") )
   }
}