使用 boto3 将文件从 FTP 复制到 S3 存储桶,ftplib 失败并显示“500 语法错误,命令无法识别”

Copy file from FTP to S3 bucket using boto3 and ftplib is failing with "500 Syntax error, command unrecognized"

我需要将数据从 FTP 服务器发送到 S3 存储桶而不将文件保存到我的本地驱动器。在互联网上,我发现我们可以使用 io.BytesIO() 作为缓冲区。但是我的代码失败了:

error_perm: 500 Syntax error, command unrecognized.

脚本:

ftp = ftplib.FTP(ipaddr)
ftp.login(usr,pswd)
ftp.cwd(folder)
myfile = io.BytesIO()
buffer = ftp.retrbinary(filename, myfile.write)
myfile.seek(0)
s3_resource.Object(bucket_name, folder + "/" + filename).put(Body=buffer)
ftp.quit()

谁能帮帮我?

您的代码至少有两个问题:

  1. 您的直接问题是,您在 Connection.retrbinary 调用中缺少 FTP 命令 (RETR)。这就是为什么你得到 "error_perm: 500 语法错误,命令无法识别。"。应该是:

    ftp.retrbinary("RETR " + filename, myfile.write)
    
  2. 一旦你解决了这个问题,你会发现内容不会进入 S3,因为你正在传递 FTP 响应(buffer),而不是下载的内容 (myfile) 到 S3,正如@dreamca4er 评论的那样。应该是:

    s3_resource.Object(bucket_name, folder + "/" + filename).put(Body=myfile)