解析不同的文件类型
Parsing different file types
我正在学习 Kotlin,但在理解如何继续学习时遇到了一些困难
目前我有一个从前端发送的 kml 文件,但现在我想接受 geoJson 并存储这个我数据库 -> 所以我需要在 Kotlin 中创建一个函数来验证文件类型并根据类型 return 正确的对象。
这是接受 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)
}
}
所以我可能需要创建一个函数来检测正确的文件,但是我可以 return 在此处键入 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")
}
实际上,“文件类型”是什么意思? geoJson 和 kml 这两种类型都是文本文件。它们没有任何定义类型的幻数编码。所以,我看到以下选项:
- 使用用户上传的原始文件的扩展名。为此,您可以使用 MultipartFile.getOriginalFilename
- 上传文件时使用FE设置的内容类型。 MultipartFile.getContentType。它很可能无法开箱即用,您需要调整前端。
- 检查实际文件内容。这是最复杂的选项,但是由于 kml 基于 xml 而 geoJson 基于 JSON应该是可行的。
- 最后是最简单的解决方案:为两种类型创建单独的端点。
我正在学习 Kotlin,但在理解如何继续学习时遇到了一些困难
目前我有一个从前端发送的 kml 文件,但现在我想接受 geoJson 并存储这个我数据库 -> 所以我需要在 Kotlin 中创建一个函数来验证文件类型并根据类型 return 正确的对象。
这是接受 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)
}
}
所以我可能需要创建一个函数来检测正确的文件,但是我可以 return 在此处键入 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")
}
实际上,“文件类型”是什么意思? geoJson 和 kml 这两种类型都是文本文件。它们没有任何定义类型的幻数编码。所以,我看到以下选项:
- 使用用户上传的原始文件的扩展名。为此,您可以使用 MultipartFile.getOriginalFilename
- 上传文件时使用FE设置的内容类型。 MultipartFile.getContentType。它很可能无法开箱即用,您需要调整前端。
- 检查实际文件内容。这是最复杂的选项,但是由于 kml 基于 xml 而 geoJson 基于 JSON应该是可行的。
- 最后是最简单的解决方案:为两种类型创建单独的端点。