从第三方RESTful API取数并保留原文件名的NiFi配置咨询
解决思路:保留第三方API返回的原文件名
这里有几个实用的方案,你可以根据目标API的实际返回情况来选择:
方案1:从响应头Content-Disposition提取原文件名(优先推荐)
大多数提供文件下载的REST API,都会在响应头里带上Content-Disposition字段,格式通常是这样的:
attachment; filename="original_daily_report_20190402.csv"
你可以按以下步骤配置NiFi流程:
- 在每个
InvokeHTTP处理器之后,添加一个ExtractHttpHeaders处理器,配置它提取Content-Disposition头并存储为自定义属性(比如命名为content.disposition)。 - 紧接着用
UpdateAttribute处理器,新增一个filename属性,用NiFi表达式语言解析头信息里的文件名:
这个表达式会自动剥离头信息里的多余内容,精准提取出引号内(或无引号)的原始文件名。${content.disposition:replaceFirst('.*filename="?([^"]+)"?.*', '$1')} - 最后用
PutFile处理器,将输出目录设置好后,把Filename字段指定为${filename},就能用原文件名输出文件了。
方案2:从请求URL中直接截取原文件名
如果目标API没有返回Content-Disposition头,也可以直接从你请求的URL里提取文件名:
- 在
InvokeHTTP之后添加UpdateAttribute处理器,用表达式语言从请求URL属性中截取最后一段:
这个表达式会自动获取URL最后一个斜杠后的内容,也就是你提供的URL里类似${http.url:substringAfterLast('/')}2019-04-02T01:50:00Z.csv的原始文件名。 - 同样用
PutFile指定${filename}作为输出文件名即可。
可选优化:合并两个InvokeHTTP流程
如果你不想维护两条独立的下载流程,可以把所有目标URL整合到一个流程里处理:
- 用
ListGenerateFlowFile处理器,在Value字段里逐行输入所有需要下载的URL。 - 配置
InvokeHTTP的Remote URL为${filename}(ListGenerateFlowFile默认会把每行内容存到filename属性里,你也可以自定义属性名),HTTP方法设为GET。 - 后续用上面的方案1或2提取原文件名,统一输出即可。
这样不管是csv还是pdf格式的文件,都能自动保留原始文件名,不用再分开维护两套流程啦。
内容的提问来源于stack exchange,提问作者Donna
相关产品推荐
相关产品推荐

