【问题标题】:Parsing different file types解析不同的文件类型
【发布时间】:2021-01-28 21:28:30
【问题描述】:

我正在学习 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")
}

【问题讨论】:

  • 我宁愿使用枚举类 PolygonFileType { KML, GEOJSON } 作为检测文件类型()的返回类型:PolygonFileType。
  • @HonzaMusil 确实让它保持不变,因为它永远不会改变,但是,我需要检测文件类型,你知道从输入流中找到文件类型的有效方法吗?

标签: java kotlin geojson


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我第一次处理 kml 和 geoJsoin,包括 Kotlin 本身的语言,所以请原谅我,据我了解,KML 类似于 GeoJSON,可以存储点、线、多边形,不像 GeoJSON ,它基于 XML 而不是 JSON。因此,由于它们都是文本文件,因此我将无法获得相同的 mime 类型,因此我的选择是采用扩展名并以这种方式检测它。如果您没有多少时间,您可以开始聊天并回答几个问题跨度>
  • @Prozorov 对不起,我今天的工作结束了。但是,如果您决定使用文件扩展名,这很简单:从MultipartFile.getOriginalFilename 获取它,然后调用parseKmlToPolygonsparseGeoJsonToPolygons
  • 谢谢,我正在尝试使用一个基于检测到的文件执行解析的函数
  • 嘿伙计,我已经用检测方法更新了它,可以这样做还是我可以以某种方式简化或改进它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
相关资源
最近更新 更多