From a041409ff7c0f87ad64237b440603eb1121eb36e Mon Sep 17 00:00:00 2001 From: johnniang Date: Sun, 17 Nov 2019 23:00:50 +0800 Subject: [PATCH] Accomplish zip utility --- .../java/run/halo/app/utils/FileUtils.java | 52 +++++++++++++++++++ .../run/halo/app/utils/FileUtilsTest.java | 31 +++++++++++ .../java/run/halo/app/utils/PathsTest.java | 1 - 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/src/main/java/run/halo/app/utils/FileUtils.java b/src/main/java/run/halo/app/utils/FileUtils.java index 794a9f472..a2ef421e2 100644 --- a/src/main/java/run/halo/app/utils/FileUtils.java +++ b/src/main/java/run/halo/app/utils/FileUtils.java @@ -1,12 +1,15 @@ package run.halo.app.utils; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import run.halo.app.exception.ForbiddenException; import java.io.ByteArrayInputStream; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.*; @@ -16,6 +19,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; /** * File utilities. @@ -117,6 +121,54 @@ public class FileUtils { } } + /** + * Zip folder or file. + * + * @param fileToZip file path to zip must not be null + * @param zipOut zip output stream must not be null + * @throws IOException + */ + public static void zip(@NonNull Path fileToZip, @NonNull ZipOutputStream zipOut) throws IOException { + // Zip file + zip(fileToZip, fileToZip.getFileName().toString(), zipOut); + } + + /** + * Zip folder or file. + * + * @param fileToZip file path to zip must not be null + * @param fileName file name must not be blank + * @param zipOut zip output stream must not be null + * @throws IOException + */ + private static void zip(@NonNull Path fileToZip, @NonNull String fileName, @NonNull ZipOutputStream zipOut) throws IOException { + if (Files.isDirectory(fileToZip)) { + log.debug("Try to zip folder: [{}]", fileToZip); + // Append with '/' if missing + String folderName = StringUtils.appendIfMissing(fileName, File.separator, File.separator); + // Create zip entry and put into zip output stream + zipOut.putNextEntry(new ZipEntry(folderName)); + // Close entry for writing the next entry + zipOut.closeEntry(); + + // Iterate the sub files recursively + List subFiles = Files.list(fileToZip).collect(Collectors.toList()); + for (Path subFileToZip : subFiles) { + zip(subFileToZip, folderName + subFileToZip.getFileName(), zipOut); + } + } else { + // Open file to be zipped + try (InputStream inputStream = Files.newInputStream(fileToZip)) { + // Create zip entry for target file + ZipEntry zipEntry = new ZipEntry(fileName); + // Put the entry into zip output stream + zipOut.putNextEntry(zipEntry); + // Copy + IOUtils.copy(inputStream, zipOut); + } + } + } + /** * Unzips content to the target path. diff --git a/src/test/java/run/halo/app/utils/FileUtilsTest.java b/src/test/java/run/halo/app/utils/FileUtilsTest.java index 1f261f3b0..f618e6248 100644 --- a/src/test/java/run/halo/app/utils/FileUtilsTest.java +++ b/src/test/java/run/halo/app/utils/FileUtilsTest.java @@ -1,14 +1,18 @@ package run.halo.app.utils; +import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.Test; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.zip.ZipOutputStream; import static org.hamcrest.Matchers.equalTo; @@ -16,6 +20,7 @@ import static org.hamcrest.Matchers.equalTo; * @author johnniang * @date 19-4-19 */ +@Slf4j public class FileUtilsTest { @Test @@ -57,4 +62,30 @@ public class FileUtilsTest { Assert.assertTrue(Files.notExists(tempDirectory)); } + + @Test + public void zipFolderTest() throws IOException { + // Create some temporary files + Path rootFolder = Files.createTempDirectory("zip-root-"); + log.debug("Folder name: [{}]", rootFolder.getFileName()); + Files.createTempFile(rootFolder, "zip-file1-", ".txt"); + Files.createTempFile(rootFolder, "zip-file2-", ".txt"); + Path subRootFolder = Files.createTempDirectory(rootFolder, "zip-subroot-"); + Files.createTempFile(subRootFolder, "zip-subfile1-", ".txt"); + Files.createTempFile(subRootFolder, "zip-subfile2-", ".txt"); + + // Create target file + Path zipToStore = Files.createTempFile("zipped-", ".zip"); + // Create zip output stream + try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipToStore))) { + // Zip file + FileUtils.zip(rootFolder, zipOut); + } + + + // Clear the test folder created before + FileUtils.deleteFolder(rootFolder); + Files.delete(zipToStore); + + } } \ No newline at end of file diff --git a/src/test/java/run/halo/app/utils/PathsTest.java b/src/test/java/run/halo/app/utils/PathsTest.java index 92685a15b..9b6d19fa4 100644 --- a/src/test/java/run/halo/app/utils/PathsTest.java +++ b/src/test/java/run/halo/app/utils/PathsTest.java @@ -17,7 +17,6 @@ import static org.junit.Assert.assertTrue; */ public class PathsTest { - @Test public void getTest() { Path path = Paths.get("/home/test/", "/upload/test.txt");