zip/rar extractors filter out non-image files

This commit is contained in:
Gauthier Roebroeck 2019-08-16 22:00:06 +08:00
parent 77b691e49d
commit 390baf15bb
4 changed files with 22 additions and 8 deletions

View file

@ -6,7 +6,6 @@ import java.nio.file.Path
import java.util.* import java.util.*
abstract class ArchiveExtractor { abstract class ArchiveExtractor {
protected val natSortComparator: Comparator<String> = CaseInsensitiveSimpleNaturalComparator.getInstance() protected val natSortComparator: Comparator<String> = CaseInsensitiveSimpleNaturalComparator.getInstance()
abstract fun getFilenames(path: Path): List<String> abstract fun getFilenames(path: Path): List<String>

View file

@ -36,4 +36,11 @@ class ContentDetector(
return mediaType.toString() return mediaType.toString()
} }
} }
fun isImage(stream: InputStream): Boolean =
try {
detectMediaType(stream).startsWith("image/")
} catch (ex: Exception) {
false
}
} }

View file

@ -7,13 +7,16 @@ import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
@Service @Service
class RarExtractor : ArchiveExtractor() { class RarExtractor(
private val contentDetector: ContentDetector
) : ArchiveExtractor() {
override fun getFilenames(path: Path): List<String> { override fun getFilenames(path: Path): List<String> {
val archive = Archive(Files.newInputStream(path)) val archive = Archive(Files.newInputStream(path))
return archive.fileHeaders return archive.fileHeaders
.filter { !it.isDirectory } .filter { !it.isDirectory }
.filter { contentDetector.isImage(archive.getInputStream(it)) }
.map { it.fileNameString } .map { it.fileNameString }
.sortedWith(natSortComparator) .sortedWith(natSortComparator)
} }

View file

@ -6,13 +6,18 @@ import java.nio.file.Path
import java.util.zip.ZipFile import java.util.zip.ZipFile
@Service @Service
class ZipExtractor : ArchiveExtractor() { class ZipExtractor(
private val contentDetector: ContentDetector
) : ArchiveExtractor() {
override fun getFilenames(path: Path) = override fun getFilenames(path: Path): List<String> {
ZipFile(path.toFile()).entries().toList() val zip = ZipFile(path.toFile())
.filter { !it.isDirectory } return zip.entries().toList()
.map { it.name } .filter { !it.isDirectory }
.sortedWith(natSortComparator) .filter { contentDetector.isImage(zip.getInputStream(it)) }
.map { it.name }
.sortedWith(natSortComparator)
}
override fun getEntryStream(path: Path, entryName: String): InputStream = override fun getEntryStream(path: Path, entryName: String): InputStream =
ZipFile(path.toFile()).let { ZipFile(path.toFile()).let {