提取 zip 并转换为每个文件的 base 64
Extract the zip and convert to base 64 of each file
我正在从系统中读取附件列表 returns base 64 编码字符串中的附加文档作为 zip,我的 objective 是获取 base 64 编码每个附加文档的字符串。
注意:- 我正在尝试下面的代码,我正在解压缩 zip 并在我的本地文件系统中写入。
.但实际上我想为每个文件获取 base 64 格式而不在本地文件系统中写入文件。
public class UnzipUtility {
private static final int BUFFER_SIZE = 4096;
private static void extractFile(ZipInputStream zipIn, ZipEntry entry) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/Project/"+File.separator+entry.getName()));
byte[] bytesIn = new byte[BUFFER_SIZE];
System.out.println("File Name "+entry.getName());
int read = 0;
while ((read = zipIn.read(bytesIn)) != -1) {
//Hear I dont not want to write the output stream insted I want to get the base64 data for each file.
bos.write(bytesIn);
}
bos.close();
}
public static void main(String[] args) throws IOException {
String attachmentVariable="zip base 64 data"
byte[] bytedata = attachmentVariable.getBytes("UTF-8");
byte[] valueDecoded = Base64.decodeBase64(bytedata);
ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(valueDecoded));
ZipEntry entry = zipIn.getNextEntry();
// iterates over entries in the zip file
while (entry != null) { extractFile(zipIn,entry);
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
}
}
要在写入 OutputStream
时对数据进行 Base64 编码,请使用 Encoder.wrap(OutputStream os)
方法。
默认情况下,BufferedOutputStream
将使用 8192 字节的缓冲区,因此如果将 BUFFER_SIZE
增加到 8192,则不需要 BufferedOutputStream
。
您应该使用 try-with-resources 和较新的 NIO.2 API.
这意味着您的代码应该是:
private static final int BUFFER_SIZE = 8192;
private static void extractFile(ZipInputStream zipIn, ZipEntry entry) throws IOException {
try ( OutputStream fos = Files.newOutputStream(Paths.get("D:/Project", entry.getName()));
OutputStream b64os = Base64.getEncoder().wrap(fos); ) {
System.out.println("File Name " + entry.getName());
byte[] buf = new byte[BUFFER_SIZE];
for (int len = 0; (len = zipIn.read(buf)) != -1; ) {
b64os.write(buf, 0, len);
}
}
}
所以,你有一个 Base64 编码的字符串和一个 zip 文件,你想要一个 Map<String, String>
,其中键是 zip 条目名称,值是 Base64 编码的内容。
在 Java 9+ 中,可以像这样轻松完成:
String base64ZipFile = "zip base 64 data";
Map<String, String> base64Entries = new LinkedHashMap<>();
try (ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(base64ZipFile)))) {
Encoder encoder = Base64.getEncoder();
for (ZipEntry entry; (entry = zipIn.getNextEntry()) != null; ) {
base64Entries.put(entry.getName(), encoder.encodeToString(zipIn.readAllBytes()));
}
}
我正在从系统中读取附件列表 returns base 64 编码字符串中的附加文档作为 zip,我的 objective 是获取 base 64 编码每个附加文档的字符串。 注意:- 我正在尝试下面的代码,我正在解压缩 zip 并在我的本地文件系统中写入。 .但实际上我想为每个文件获取 base 64 格式而不在本地文件系统中写入文件。
public class UnzipUtility {
private static final int BUFFER_SIZE = 4096;
private static void extractFile(ZipInputStream zipIn, ZipEntry entry) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/Project/"+File.separator+entry.getName()));
byte[] bytesIn = new byte[BUFFER_SIZE];
System.out.println("File Name "+entry.getName());
int read = 0;
while ((read = zipIn.read(bytesIn)) != -1) {
//Hear I dont not want to write the output stream insted I want to get the base64 data for each file.
bos.write(bytesIn);
}
bos.close();
}
public static void main(String[] args) throws IOException {
String attachmentVariable="zip base 64 data"
byte[] bytedata = attachmentVariable.getBytes("UTF-8");
byte[] valueDecoded = Base64.decodeBase64(bytedata);
ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(valueDecoded));
ZipEntry entry = zipIn.getNextEntry();
// iterates over entries in the zip file
while (entry != null) { extractFile(zipIn,entry);
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
}
}
要在写入 OutputStream
时对数据进行 Base64 编码,请使用 Encoder.wrap(OutputStream os)
方法。
默认情况下,BufferedOutputStream
将使用 8192 字节的缓冲区,因此如果将 BUFFER_SIZE
增加到 8192,则不需要 BufferedOutputStream
。
您应该使用 try-with-resources 和较新的 NIO.2 API.
这意味着您的代码应该是:
private static final int BUFFER_SIZE = 8192;
private static void extractFile(ZipInputStream zipIn, ZipEntry entry) throws IOException {
try ( OutputStream fos = Files.newOutputStream(Paths.get("D:/Project", entry.getName()));
OutputStream b64os = Base64.getEncoder().wrap(fos); ) {
System.out.println("File Name " + entry.getName());
byte[] buf = new byte[BUFFER_SIZE];
for (int len = 0; (len = zipIn.read(buf)) != -1; ) {
b64os.write(buf, 0, len);
}
}
}
所以,你有一个 Base64 编码的字符串和一个 zip 文件,你想要一个 Map<String, String>
,其中键是 zip 条目名称,值是 Base64 编码的内容。
在 Java 9+ 中,可以像这样轻松完成:
String base64ZipFile = "zip base 64 data";
Map<String, String> base64Entries = new LinkedHashMap<>();
try (ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(base64ZipFile)))) {
Encoder encoder = Base64.getEncoder();
for (ZipEntry entry; (entry = zipIn.getNextEntry()) != null; ) {
base64Entries.put(entry.getName(), encoder.encodeToString(zipIn.readAllBytes()));
}
}