如何在Synapse中从动态生成文件的SFTP下载带内容的文件?
解决Synapse中SFTP动态生成文件下载无内容的问题
问题根源
Synapse的Copy Activity默认会先读取SFTP文件的元数据(包括文件大小),而非直接执行get命令触发文件生成,因此拿到的是服务器上初始的0字节空文件。WinSCP是直接发送get命令触发动态生成,所以能获取到完整内容。
解决方案
1. 改用Execute SSH任务直接执行SFTP get命令(推荐)
这是最可靠的方式,直接模拟WinSCP的操作逻辑:
- 配置SSH Linked Service:选择"SSH"类型,填写SFTP服务器地址、用户名,在"Authentication method"中选"SSH Private Key",上传你的密钥文件并填写密钥的passphrase(若用Azure Key Vault存储,可直接引用)。
- 添加Execute SSH活动到管道中,在"Command"里编写SFTP下载脚本:
sftp -i /path/to/your/private_key -o Passphrase=your_passphrase your_username@sftp_server <<EOF get /remote/sftp/path/target_file.csv /synapse/storage/path/saved_file.csv # 批量下载可添加多个get命令或循环逻辑 EOF注意:托管集成运行时需确保密钥文件已上传至可访问位置;自托管集成运行时要保证运行账户有密钥文件的读取权限。
2. 尝试修改Copy Activity的预检查设置(备选)
若坚持使用Copy Activity,可尝试关闭元数据预检查:
- 在Copy Activity的Settings选项卡中,找到"Copy Behavior"区域,禁用"Preserve file metadata"选项;同时检查是否有"Skip file existence check"类开关(不同版本命名可能有差异)并开启。
- 此方法不保证100%生效,因为Synapse Copy Activity底层仍可能提前读取文件元数据。
3. 验证下载结果
在下载任务后添加Get Metadata活动,检查下载文件的Size属性,确认文件大小大于0字节,确保动态生成逻辑已被触发。
额外注意事项
- 确保Synapse集成运行时(IR)与SFTP服务器网络连通:托管IR需在SFTP服务器白名单内;自托管IR要部署在可访问SFTP的网络环境中。
- 密钥文件权限配置:自托管IR运行账户需对密钥文件有读取权限,避免因权限不足导致SSH连接失败。
内容的提问来源于stack exchange,提问作者Jing
相关产品推荐
相关产品推荐

