使用 NiFi 获取实际的文件扩展名

Get the actual file extension using NiFi

我正在使用 Apache NiFi 从 Azure 存储中获取数据。现在,我想要读取一个大文件(100+ GB)的文件可以有任何扩展名,我想读取文件的 header 以获得它的实际扩展名。

我发现 python-magic 包使用 libmagic 读取文件的 header 来获取扩展名,但这需要文件存在于本地。

摄取数据的 NiFi 管道如下所示

我需要一种方法来获取此 NiFi 管道中的文件扩展名。有没有办法从 Content Repo 中读取文件的 header?如果是,我们该怎么做? FlowFile 只有元数据表明 content-type 作为 CSV 的 text/plain

所有 文件都没有通用的'header' 可以为您提供“真正的”扩展名。一个文件只是 collection 位,我们有时选择给出 extensions/headers/footers/etc 以便我们知道如何解释这些位。

我们倾向于通过两种方式添加 'type' 信息,通过文件扩展名,例如.mp4 and/or 通过文件附带的一些元数据 - 这有时是 header,有时是明文且易于阅读,但这并不总是正确的。此外,由用户 and/or 应用程序设置此信息,并由用户 and/or 应用程序读取它 - 两者都不是给定的。

如果您不相信该文件应用了正确的扩展名(例如 video.txt 当它实际上是 mp4 时),那么您还可以尝试询问 Azure Blob 存储中保存的元数据 (ContentType)看看上面说的是什么 - 然而,这也取决于 user/application 在文件上传到 ABS 时设置,因此不能保证它比文件扩展名更准确。

对于明文 CSV,

text/plain 并非 无效 ,因为 CSV 只是格式化的明文 - 类似于 JSON。但是,您可以 更具体 并使用例如text/csv 用于 CSV,application/json 用于 JSON。

NiFi确实有IndentifyMimeType which can try to work it out for you by interrogating the file, but it is more complex that just accessing some 'header'. This processor uses Apache Tika用于检测,并在FlowFile中添加了mime.type属性。

如果您的文件是某种自定义格式,那么此处理器可能无法帮助您。如果您知道您的文件具有特定的 header,那么您将需要针对您的具体情况提供更多信息。