Nifi多部分形式

Posted

技术标签:

【中文标题】Nifi多部分形式【英文标题】:Nifi multipart form 【发布时间】:2019-07-20 07:52:55 【问题描述】:

我正在尝试将一个非常简单的多部分表单发布到 api。我在 apache Nifi 中看不到任何这样做的方法,因为它似乎只有一个表单数据输入。在这里和 Nifi 论坛上似乎有很多关于此的现有问题,但没有一个有任何答案。

我正在尝试使用invokehttp。有没有办法在我把它放入invokehttp之前构建多个表单数据?

【问题讨论】:

可以使用脚本... James,你能提供一个多部分传入 ff 和所需传出 ff 的示例吗? @daggett 像这样: curl -F person=anonymous -F secret=@file.txt example.com/submit.cgi 【参考方案1】:

您可以使用ExecuteGroovyScript 处理器和以下代码来构建多部分/表单数据:

@Grab(group='org.apache.httpcomponents', module='httpmime', version='4.5.9')

import org.apache.http.entity.mime.MultipartEntityBuilder
import org.apache.http.entity.ContentType

def ff = session.get()
if(!ff)return

def multipart

ff.writestreamIn, streamOut->
    multipart = MultipartEntityBuilder.create()
        //specify multipart entries here
        .addTextBody( "username", ff.filename ) //get from flowfile attribute "filename"
        .addTextBody( "secret", new File("./README").getText("UTF-8") ) //add text body from file
        .addBinaryBody( "avatar", streamIn, ContentType.DEFAULT_BINARY, ff.filename )   //add flowfile content as binary body
        .build()
    multipart.writeTo(streamOut)

//set the `mime.type` attribute to be used as `Content-Type` in InvokeHTTP
ff."mime.type" = multipart.getContentType().getValue()
REL_SUCCESS << ff

检查其他 add* 方法以添加多部分参数:org.apache.http.entity.mime.MultipartEntityBuilder


为了检查这段代码,我在ExecuteGroovyScript 之后使用了InvokeHTTP 处理器,只更改了以下参数:

HTTP 方法:POST 远程网址:http://httpbin.org/post

【讨论】:

group='org.apache.httpcomponents', module='httpmime', version='4.5.9' ... 找不到准确的版本.. 如何找到准确的版本 mvnrepository.com/artifact/org.apache.httpcomponents/httpmime【参考方案2】:

如果您在InvokeHTTP 处理器上设置一个名为Content-Type 和值multipart/form-data动态属性,您会得到什么错误?通过指定动态属性,它将作为标题Content-Type: multipart/form-data 发送。

InvokeHTTP 将简单地将流文件内容作为请求正文发送。期望输入的远程端点是什么,这与您当前能够发送的有什么不同?

【讨论】:

似乎多部分表单项需要作为单独定义的表单属性发送,但 Nifi 只允许将请求正文作为单个块发送。 你可以用webhook.site这样的在线端点来查看【参考方案3】:

我想我会为这个问题添加一个答案,因为InvokeHTTP 在1.12.0 中添加了一个属性,现在可以开箱即用。

您可以将 Content Type 属性设置为 multipart/form-data

而新属性Flowfile Form Data Name 允许您设置表单内容所针对的属性的名称。

例如,如果您的表单需要一个名为 file 的属性来包含文件上传,您可以将 Flowfile Form Data Name 设置为 file

这将等同于以下 cURL curl -X POST &lt;url&gt; -F 'file=@./myfile' -H 'Content-Type: multipart/form-data'

【讨论】:

以上是关于Nifi多部分形式的主要内容,如果未能解决你的问题,请参考以下文章

net.schmizz.sshj.DefaultConfig Illegal key size问题,NIFI部分版本因此无法正常启动

Apache NiFi 核心概念和关键特性

多部分消息以文本/纯文本而不是 java 中的多部分/替代形式发送

nifi生产环境使用

Swift 上传 UIImage 与多部分形式没有参数

使用多部分形式的 Swift IOS 进行流式上传