You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现SFTP文件直传GCS?遇SFTPFile转Unicode错误求解决

解决SFTP文件直接上传Google Cloud Storage的错误

错误原因分析

你遇到的ValueError是因为两处参数使用错误:

  • bucket.blob()需要传入字符串类型的目标文件名(即文件在GCS存储桶中的名称),但你传入了paramiko.SFTPFile对象,导致类型转换失败。
  • upload_from_filename()方法用于从本地文件路径读取文件上传,不能直接传入SFTP的文件流对象,应该使用upload_from_file()来处理流式上传。

修正后的代码

from google.cloud import storage 
import paramiko

# 连接参数
host = 'host'
port = 22
usr = 'me'
pwd = '0123'
sftp_file_path = './file.csv'
gcs_target_filename = 'file.csv'  # GCS存储桶中保存的文件名
bucket_name = 'the_bucket'

# 建立SFTP连接(使用上下文管理器自动关闭连接)
with paramiko.SSHClient() as sftp_client:
    sftp_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    sftp_client.connect(host, port, usr, pwd)
    with sftp_client.open_sftp() as sftp:
        # 打开SFTP上的文件(二进制读模式)
        with sftp.open(sftp_file_path, 'rb') as sftp_file:
            # 初始化GCS客户端并上传文件流
            storage_client = storage.Client()
            bucket = storage_client.bucket(bucket_name)
            blob = bucket.blob(gcs_target_filename)
            # 直接从SFTP文件流上传到GCS
            blob.upload_from_file(sftp_file)

关键修改点

  • 给bucket.blob()传入明确的字符串文件名gcs_target_filename,指定文件在GCS中的存储名称。
  • 使用upload_from_file()替代upload_from_filename(),直接读取SFTP的文件流完成上传,无需本地保存文件。
  • 嵌套使用with上下文管理器,确保SFTP连接、文件对象能自动关闭,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Maximuluss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:45:07