如何使用Apache NiFi将SQL Server中的二进制文件流上传至AWS S3存储桶?
解决Apache NiFi上传SQL Server文件流到AWS S3的格式问题
你的流程问题出在不必要的JSON转换和重复Base64编码,导致原始二进制文件流被破坏,变成了文本格式的编码内容。以下是修正后的可行流程:
修正后的处理器流程
- ExecuteSQL:保持查询
select filename, filestream from table,但需确保JDBC驱动支持SQL Server Filestream,连接字符串添加;filestream=true参数,保证filestream列以二进制形式读取。 - SplitAvro:将ExecuteSQL返回的批量Avro数据拆分为单个FlowFile,每个FlowFile对应一条数据库记录(一个文件的文件名+流)。
- ExtractAvroField:配置两个提取规则:
- 提取
filename字段,设置为FlowFile的属性(比如命名为filename)。 - 提取
filestream字段,设置为FlowFile的内容(替换原有Avro内容,直接用原始二进制流)。
- 提取
- PutS3Object:在处理器配置中,将S3对象的
Key设置为${filename},这样上传到S3的文件会使用数据库里的原始文件名,内容是未经过编码的原始二进制流,自然就是正确的PNG/XLSX等格式。
原流程问题分析
- ConvertAvroToJson:Avro本身可以直接存储二进制数据,但转成JSON时,二进制流会被自动序列化为Base64字符串(JSON不支持原生二进制),这一步已经破坏了原始文件的二进制结构。
- Base64EncodeContent:对已经是Base64的字符串再次编码,导致最终上传到S3的是双重Base64编码的文本,而非原始二进制文件,所以无法被识别为对应格式的文件。
内容的提问来源于stack exchange,提问作者code_hr
相关产品推荐
相关产品推荐

