首页 > 解决方案 > 解析不同的文件类型

问题描述

我正在学习 Kotlin,但在理解如何进行时遇到了一些困难

目前我有一个从前端发送的kml文件,但现在我想接受geoJson并存储这个 i 数据库 -> 所以我需要在 Kotlin 中创建一个函数来验证文件类型并根据类型返回正确的对象。

这是接受 kml 文件并调用 parseKmlToPolygons 的函数

fun parseKmlToPolygons(file: MultipartFile, applicationConfiguration: ApplicationConfiguration): Geometry {
    if (file.size > applicationConfiguration.getMaxKmlUploadFileSizeLimitInBytes()) {
        throw FileUploadSizeLimitReachedException()
    }
    return parseMultiParFileToPolygons(file.inputStream)
}

private fun parseKmlToPolygons(content: InputStream): Geometry {
    try {
        val kml = Kml.unmarshal(content) ?: throw InvalidKmlException("Failed to parse the kml file")

        return toGeometry(kml.feature)
    } catch (ex: IllegalArgumentException) {
        throw InvalidKmlException(ex.localizedMessage, ex)
    } catch (ex: InvalidGeometryException) {
        throw InvalidKmlException(ex.localizedMessage, ex)
    }
}

所以我可能需要创建一个检测正确文件的函数,但是我可以在这里返回类型 Any 吗?另外,是否可以从 inputStream 中获取文件的类型?

private fun detectFileType():Any {

}

如果我在这里不是很清楚,我很抱歉,我所需要的只是替换采用 kml 文件的功能,以便能够采用 kml 或 geoJson

更新

  //todo would be better to have detection logic separate 
private fun parseKmlToPolygons(file: MultipartFile): Geometry {
    val fileExtension: String = FilenameUtils.getExtension(file.originalFilename)
    if (fileExtension == PolygonFileType.KML.name) {
        return parseKmlToPolygons(file.inputStream)
    } else if (fileExtension == PolygonFileType.GEOJSON.name) {
        return parseKmlToPolygons(file.inputStream)
    }
    throw FormatNotSupportedException("File format is not supported")
}

标签: javakotlingeojson

解决方案


实际上,“文件类型”是什么意思?geoJson 和 kml 这两种类型都是文本文件。它们没有任何编码定义类型的幻数。所以,我看到以下选项:

  • 使用用户上传的原始文件的扩展名。为此,您可以使用MultipartFile.getOriginalFilename
  • 上传文件时使用 FE 设置的内容类型。MultipartFile.getContentType。很可能它不会开箱即用,您需要调整前端。
  • 检查实际文件内容。这是最复杂的选项,但由于kml是基于 xml 的,而geoJson是基于 JSON 的,它应该是可行的。
  • 最后是最简单的解决方案:为两种类型创建单独的端点。

推荐阅读