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

问题描述 投票:0回答:1

我有这两门课:

  1. 消息类
  2. 消息日志类

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

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

我尝试过以下代码:

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

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

是否可以转换 zip 内容(以字节为单位)并传入 String 而不损坏内容? 谢谢你。

string groovy zip byte
1个回答
0
投票

所以 Zip 文件是二进制的。字符串是使用可读的字符编码格式(ASCII、UTF-8、UTF-24 等)对二进制数据进行的解释。并非所有二进制都是字符串,但所有字符串都是二进制。 Zip 文件不能解释为字符串,因为它们不遵循任何字符编码的规则。

但是,有一种方法可以使用 Base64 编码将二进制数据表示为文本。因此,如果您对 zip 文件附件进行 Base64 编码,那么您可以将其作为字符串返回,但是为了解压缩该文件,您需要首先解码 Base64 以返回二进制文件,然后再解压缩它。

在您的帖子中,您没有提到任何有关电子邮件或 Base64 编码的内容,因此很难知道这是否是让您绊倒的原因,或者实现该方法的人没有使用 Base64,它只是乱码。

如果不将其解码回底层二进制文件,则无法读取 Base64 文件。下面是 Base64 编码和解码的示例:

import java.util.zip.*

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()
}

String base64Zip = zip.bytes.encodeBase64().toString()

println("Encoded zip as base64")
println( base64Zip )

println("Decoding base64")

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") )
   }
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.