首页 > 解决方案 > 使用 boto3 和 ftplib 将文件从 FTP 复制到 S3 存储桶失败,并出现“500 语法错误,命令无法识别”

问题描述

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

error_perm: 500 语法错误,命令无法识别。

在此处输入图像描述

剧本:

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()

任何人都可以帮助我吗?

标签: pythonamazon-s3ftpboto3ftplib

解决方案


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

  1. 您的直接问题是,您在调用中缺少 FTP 命令 ( RETR) 。Connection.retrbinary这就是为什么您会收到“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)
    

推荐阅读