From 92a0d2aafbcd15d8e8403b9a189474dec5d51127 Mon Sep 17 00:00:00 2001 From: Sambo Chea Date: Thu, 21 Apr 2022 17:11:13 +0700 Subject: [PATCH] Updated unzip for auto create all files and delete all files --- .../cubetiqs/web/modules/file/FileStorageFactory.kt | 10 ++++++++-- .../web/modules/file/FileStorageLocalProvider.kt | 9 ++++++++- .../cubetiqs/web/modules/file/FileStorageProvider.kt | 1 + .../cubetiqs/web/modules/file/FileStorageUnzip.kt | 3 ++- .../com/cubetiqs/web/modules/file/FileZipper.kt | 8 +++++++- .../web/modules/uploader/UploaderController.kt | 12 +++++++++--- .../cubetiqs/web/modules/uploader/UploaderEntity.kt | 12 ++++++++++++ 7 files changed, 47 insertions(+), 8 deletions(-) diff --git a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageFactory.kt b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageFactory.kt index d8f87e8..8ef8d38 100644 --- a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageFactory.kt +++ b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageFactory.kt @@ -32,6 +32,10 @@ object FileStorageFactory { getProvider().delete(fileName) } + fun deleteAll() { + getProvider().deleteAll() + } + fun get(fileName: String): FileResponse { return getProvider().get(fileName) } @@ -44,9 +48,11 @@ object FileStorageFactory { return null } - fun unzip(inputStream: InputStream) { + fun unzip(inputStream: InputStream): List { if (getProvider() is FileStorageUnzip) { - (getProvider() as FileStorageUnzip).unzip(inputStream, null) + return (getProvider() as FileStorageUnzip).unzip(inputStream, null) } + + return emptyList() } } \ No newline at end of file diff --git a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageLocalProvider.kt b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageLocalProvider.kt index d1ea102..2b49a57 100644 --- a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageLocalProvider.kt +++ b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageLocalProvider.kt @@ -54,6 +54,13 @@ open class FileStorageLocalProvider( } } + override fun deleteAll() { + val file = File(basePath) + if (file.isDirectory) { + file.deleteRecursively() + } + } + override fun zip(sourceFolder: String?, os: OutputStream) { FileZipper.zipToStream(sourceFolder ?: basePath, os) } @@ -62,7 +69,7 @@ open class FileStorageLocalProvider( return FileZipper.zipToBytes(sourceFolder ?: basePath) } - override fun unzip(inputStream: InputStream, destinationFolder: String?) { + override fun unzip(inputStream: InputStream, destinationFolder: String?): List { return FileZipper.unzip(inputStream, destinationFolder ?: basePath) } } \ No newline at end of file diff --git a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageProvider.kt b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageProvider.kt index 2ebc56b..82516da 100644 --- a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageProvider.kt +++ b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageProvider.kt @@ -6,4 +6,5 @@ interface FileStorageProvider { fun store(file: File): FileResponse fun get(fileName: String): FileResponse fun delete(fileName: String) + fun deleteAll() } \ No newline at end of file diff --git a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageUnzip.kt b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageUnzip.kt index 5943dd7..a5c8b21 100644 --- a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageUnzip.kt +++ b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileStorageUnzip.kt @@ -1,7 +1,8 @@ package com.cubetiqs.web.modules.file +import java.io.File import java.io.InputStream interface FileStorageUnzip { - fun unzip(inputStream: InputStream, destinationFolder: String?) + fun unzip(inputStream: InputStream, destinationFolder: String?): List } \ No newline at end of file diff --git a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileZipper.kt b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileZipper.kt index 6367e63..dad6bb0 100644 --- a/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileZipper.kt +++ b/api/src/main/kotlin/com/cubetiqs/web/modules/file/FileZipper.kt @@ -86,7 +86,9 @@ object FileZipper { } } - fun unzip(fis: InputStream, destFolder: String) { + fun unzip(fis: InputStream, destFolder: String): List { + val extractFiles = mutableListOf() + try { val root = File(destFolder) if (!root.exists()) { @@ -104,12 +106,16 @@ object FileZipper { file.mkdirs() } } + + extractFiles.add(file) zis.closeEntry() } zis.close() } catch (e: Exception) { e.printStackTrace() } + + return extractFiles } @Throws(IOException::class) diff --git a/api/src/main/kotlin/com/cubetiqs/web/modules/uploader/UploaderController.kt b/api/src/main/kotlin/com/cubetiqs/web/modules/uploader/UploaderController.kt index 3a9599c..21ef781 100644 --- a/api/src/main/kotlin/com/cubetiqs/web/modules/uploader/UploaderController.kt +++ b/api/src/main/kotlin/com/cubetiqs/web/modules/uploader/UploaderController.kt @@ -102,11 +102,13 @@ class UploaderController @Autowired constructor( @ResponseStatus(value = org.springframework.http.HttpStatus.CREATED) @PostMapping("/unzip", consumes = [MediaType.MULTIPART_FORM_DATA_VALUE]) - @Operation(summary = "Zip a file") + @Operation(summary = "Unzip a file") fun unzip( @RequestPart file: MultipartFile, - ) { - FileStorageFactory.unzip(file.inputStream) + ): List { + val files = FileStorageFactory.unzip(file.inputStream) + .map { UploaderEntity.fromFileWithoutStore(it) } + return repository.saveAll(files) } @ResponseStatus(value = org.springframework.http.HttpStatus.OK) @@ -132,6 +134,9 @@ class UploaderController @Autowired constructor( val entity = repository.findById(UUID.fromString(id)).orElseThrow { throw IllegalArgumentException("File not found") } + if (!entity.path.isNullOrEmpty()) { + FileStorageFactory.delete(entity.path!!) + } repository.delete(entity) } @@ -139,6 +144,7 @@ class UploaderController @Autowired constructor( @DeleteMapping @Operation(summary = "Delete all files") fun deleteAll() { + FileStorageFactory.deleteAll() repository.deleteAll() } } \ No newline at end of file diff --git a/api/src/main/kotlin/com/cubetiqs/web/modules/uploader/UploaderEntity.kt b/api/src/main/kotlin/com/cubetiqs/web/modules/uploader/UploaderEntity.kt index beaba44..e8de856 100644 --- a/api/src/main/kotlin/com/cubetiqs/web/modules/uploader/UploaderEntity.kt +++ b/api/src/main/kotlin/com/cubetiqs/web/modules/uploader/UploaderEntity.kt @@ -10,6 +10,7 @@ import org.springframework.web.multipart.MultipartFile import java.io.File import java.io.InputStream import java.io.Serializable +import java.nio.file.Files import java.util.* import javax.persistence.* @@ -94,6 +95,17 @@ open class UploaderEntity( return uploader } + fun fromFileWithoutStore(file: File): UploaderEntity { + val uploader = UploaderEntity() + uploader.file = file + uploader.providerType = "local" + uploader.filename = file.name + uploader.contentType = Files.probeContentType(file.toPath()) + uploader.contentLength = file.length() + uploader.path = file.path + return uploader + } + fun fromUploader(uploader: UploaderEntity): MultipartFile? { if (uploader.partFile != null) { return uploader.partFile