python - 使用 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()
任何人都可以帮助我吗?
解决方案
您的代码至少有两个问题:
您的直接问题是,您在调用中缺少 FTP 命令 (
RETR
) 。Connection.retrbinary
这就是为什么您会收到“error_perm:500 语法错误,命令无法识别”的原因。. 它应该是:ftp.retrbinary("RETR " + filename, myfile.write)
一旦你解决了这个问题,你将看到内容不会进入 S3,因为你正在将 FTP 响应 (
buffer
) 而不是下载的内容 (myfile
) 传递给 S3,正如@dreamca4er 评论的那样。它应该是:s3_resource.Object(bucket_name, folder + "/" + filename).put(Body=myfile)
推荐阅读
- json - 忽略杰克逊 JSON 解析器中的字段?
- laravel - 将 sendgrid 的事件 webhook 路由到 laravel 中的控制器
- flutter - ChangeNotifier 不更新消费者
- uart - 如何使用 bsl 擦除 msp430f2619 闪存?
- android - Android Firebase 库,仪器测试 - 无静态方法 registerDefaultInstance(Ljava/lang/Class;Lcom/google/protobuf/GeneratedMessageLite
- android - 在 WebView 中打开 PDF
- haproxy - haproxy 并不总是记录请求
- json - 如何在linux中存储json键值对并将其存储在一个变量中
- r - NA / NaN / Inf 调用外部函数 (arg 5)
- ios - 在 inputBarAccessoryView 中按下发送后如何清除 MessageKit inputBar 中的文本