Improved: Improve FileUtil to generate a zip fil with multiple entries
Add a new function zipFileStreams to extend a current zipFileStream (that permit to generate a zip file from a single file) to support the zip file creation from multiple file.
The function take a map as fileName attendee in the zip and as value the inputStream related.
diff --git a/framework/base/src/main/java/org/apache/ofbiz/base/util/FileUtil.java b/framework/base/src/main/java/org/apache/ofbiz/base/util/FileUtil.java
index 972d83e..774ae88 100644
--- a/framework/base/src/main/java/org/apache/ofbiz/base/util/FileUtil.java
+++ b/framework/base/src/main/java/org/apache/ofbiz/base/util/FileUtil.java
@@ -39,6 +39,7 @@
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.zip.Deflater;
@@ -342,8 +343,28 @@
* @throws IOException
*/
public static ByteArrayInputStream zipFileStream(InputStream fileStream, String fileName) throws IOException {
- if (fileStream == null) return null;
- if (fileName == null) fileName = UUID.randomUUID().toString();
+ if (fileStream == null) {
+ return null;
+ }
+ if (fileName == null) {
+ fileName = UUID.randomUUID().toString();
+ }
+
+ // Create zip file from content input stream
+ return zipFileStreams(Map.of(fileName, fileStream));
+ }
+
+ /**
+ * For map with entries as [fileName: inputStream], create a zip stream containing all given files
+ * @param files
+ * @return
+ * @throws IOException
+ */
+ public static ByteArrayInputStream zipFileStreams(Map<String, InputStream> files) throws IOException {
+ if (files == null) {
+ return null;
+ }
+
// Create zip file from content input stream
String zipFileName = UUID.randomUUID().toString() + ".zip";
String zipFilePath = UtilProperties.getPropertyValue("general", "http.upload.tmprepository", "runtime/tmp");
@@ -351,12 +372,16 @@
ZipOutputStream zos = new ZipOutputStream(fos);
zos.setMethod(ZipOutputStream.DEFLATED);
zos.setLevel(Deflater.BEST_COMPRESSION);
- ZipEntry ze = new ZipEntry(fileName);
- zos.putNextEntry(ze);
- int len;
- byte[] bufferData = new byte[8192];
- while ((len = fileStream.read(bufferData)) > 0) {
- zos.write(bufferData, 0, len);
+
+ // parse all map to set in the zip stream
+ for (String fileName : files.keySet()) {
+ ZipEntry ze = new ZipEntry(fileName);
+ zos.putNextEntry(ze);
+ int len;
+ byte[] bufferData = new byte[8192];
+ while ((len = files.get(fileName).read(bufferData)) > 0) {
+ zos.write(bufferData, 0, len);
+ }
}
zos.closeEntry();
zos.close();