Azure Data Factory中SFTP二进制复制如何保留原文件名?
解决Azure Data Factory复制文件保留原文件名的方案
核心思路
要保留原文件名,需先获取源文件的名称信息,再动态传递到接收端(Sink)的数据集配置中——直接用通配符批量复制时,ADF默认会生成随机文件名,无法保留原名。
具体步骤
1. 添加Get Metadata活动
- 在管道中新增Get Metadata活动,关联复制活动所用的源数据集(保持源的通配符
*.json配置,用于匹配所有目标文件)。 - 在Get Metadata的字段列表里勾选
Child items,以此获取所有匹配文件的详细信息(包含文件名)。
2. 添加For Each活动
- 将Get Metadata活动的输出作为For Each的循环输入,设置循环项表达式为:
@activity('Get Metadata活动名称').output.childItems。 - 开启For Each的
Sequential(顺序执行)选项,避免并发操作导致的文件冲突。
3. 在For Each内部配置复制活动
- 源数据集调整:修改源数据集的文件名属性,用动态表达式绑定当前循环的文件名:
@item().name。 - Sink数据集调整:修改Sink数据集的文件路径,指定
test子文件夹+原文件名,表达式为:@concat('test/', item().name)。 - 注意:Sink数据集的文件名不要设置固定值或通配符,完全通过动态表达式绑定原文件名。
4. 变量配置(可选,替代直接引用item())
如果之前尝试用变量但操作有误,可按以下方式调整:
- 定义字符串类型变量
currentFileName。 - 在For Each内新增Set Variable活动,将变量值设为
@item().name。 - 复制活动的Sink文件路径引用该变量:
@concat('test/', variables('currentFileName'))。
关键配置代码示例
Get Metadata活动输出结构(供参考)
{ "childItems": [ { "name": "sample1.json", "type": "File" }, { "name": "sample2.json", "type": "File" } ] }
For Each循环项表达式
@activity('Get Metadata').output.childItems
Sink数据集文件路径表达式
@concat('test/', item().name)
常见误区
- 直接用复制活动批量复制(源用通配符)时,Sink默认生成随机文件名,必须通过循环逐个复制才能保留原名。
- 动态表达式需确保语法正确,
item()仅在For Each循环内部有效,外部无法引用。
内容的提问来源于stack exchange,提问作者SamNrs
相关产品推荐
相关产品推荐

