Azure Data Factory接收器数据集配置求助:FTP多文件夹及文件复制至Azure存储账户异常问题
解决FTP到Azure存储复制的两个核心问题
针对你遇到的这两个复制配置问题,我来给你拆解解决方案:
问题1:@item().name参数未生效,复制了文件夹而非文件
这个问题的核心是你的循环逻辑和数据集参数没对应上——大概率是Foreach循环遍历的是文件夹,而非单个文件,导致@item().name指向的是文件夹名,而非文件名。按以下步骤调整:
调整Get Metadata的层级,确保拿到文件列表
- 如果你要批量复制多个文件夹下的.dat/.csv,建议分两层处理:
- 第一层Get Metadata:指向FTP根目录,勾选
Child items获取所有子文件夹 - 第二层(Foreach循环内):针对每个文件夹,再添加一个Get Metadata,勾选
Child items获取该文件夹下的所有文件,同时用Filter活动筛选出符合格式的文件(表达式:@or(endsWith(item().name, '.dat'), endsWith(item().name, '.csv')))
- 第一层Get Metadata:指向FTP根目录,勾选
- 确保最终Foreach循环的输入是单个文件的元数据列表,而非文件夹列表
- 如果你要批量复制多个文件夹下的.dat/.csv,建议分两层处理:
正确配置输出数据集的参数和路径
- 在Azure存储输出数据集中添加两个参数:
targetFolder(目标存储的文件夹路径)和sourceFileName(原始文件名) - 数据集的文件路径设置为:
@concat(dataset().targetFolder, '/', dataset().sourceFileName) - 在Copy活动的接收器参数赋值:
targetFolder:可以固定为你的目标存储路径,比如ftp-filessourceFileName:@item().name(此时item是单个文件的元数据,所以name就是带扩展名的原始文件名)
- 在Azure存储输出数据集中添加两个参数:
问题2:自动添加.txt扩展名,丢失原文件格式
这个是因为当你未明确指定文件名时,ADF会默认用自动生成的名称+.txt后缀,同时如果文件格式选错也会触发这个问题。解决方法如下:
明确指定原始文件名
- 在Copy活动的接收器设置中,找到「文件名」选项,选择「来自源文件的名称」,或者直接用表达式提取原始文件名:
这个表达式能从完整的FTP文件路径中提取最后一段(即带扩展名的原始文件名)@last(split(item().name, '/'))
- 在Copy活动的接收器设置中,找到「文件名」选项,选择「来自源文件的名称」,或者直接用表达式提取原始文件名:
匹配正确的文件格式
- 对于.csv文件:设置数据集格式为
Delimited Text,并勾选「第一行作为标题」(如果需要) - 对于.dat文件:设置数据集格式为
Binary(因为.dat通常是二进制或自定义格式,用Binary可以避免ADF自动添加文本后缀,同时完整保留原始内容)
- 对于.csv文件:设置数据集格式为
完整流程示例
- Get Metadata(FTP根目录):获取所有子文件夹,输出为
childItems - Foreach循环:遍历上述文件夹列表
- 内部添加Get Metadata(当前文件夹):获取该文件夹下的所有子项
- 内部添加Filter活动:筛选出
.dat和.csv文件,输出为filteredFiles - 内部添加Foreach循环:遍历
filteredFiles列表- 内部添加Copy活动:
- 源数据集:FTP,路径设置为
@item().folderPath,文件名设置为@item().name - 接收器数据集:Azure存储,参数
targetFolder设为你的目标路径,sourceFileName设为@item().name,文件格式对应选择Delimited Text或Binary
- 源数据集:FTP,路径设置为
- 内部添加Copy活动:
这样配置后,就能精准复制指定格式的文件,完整保留原始文件名和扩展名,不会复制整个文件夹。
内容的提问来源于stack exchange,提问作者kira_22




