预期的str,字节或os.PathLike对象,而不是dict:TypeError

时间:2019-05-11 16:22:34

标签: python amazon-web-services amazon-s3 aws-lambda ftplib

从s3存储桶将zip文件上传到FTP位置时出现错误。在这里,我使用的是公共FTP,我们可以使用匿名FTP。

请找到以下代码

s3 = boto3.resource('s3')
print("Loading the function")

def lambda_handler(event, context):
    ftp = ftplib.FTP("speedtest.tele2.net")
    ftp.login()
    ftp.cwd("/upload")
    print(event)
    src_bucket = event['Records'][0]['s3']['bucket']['name']
    print("Source Bucket name:",src_bucket)
    dest_bucket= "dest-bucket-name-here"
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    filename= ntpath.basename(key)
    print('Received file :{} and fullpath location: {}'.format(filename,key))
    copy_source = {'Bucket': src_bucket,'Key': key}
    bucket = s3.Bucket(dest_bucket)
    ftp.storbinary("STOR " + filename, open(copy_source, 'r'))  # error is as mentioned in title.

预期的输出:文件应上载到FTP路径。 (由于它是用于测试的公共FTP,一旦上传的文件将被speedtest自动删除。)

1 个答案:

答案 0 :(得分:0)

ftp.storbinary期望像字符串一样的file object作为输入,但是您将其传递给字典copy_source = {'Bucket': src_bucket,'Key': key},因此错误expected str, bytes or os.PathLike object, not dict: TypeError

提供正确的文件名(我猜这里filename= ntpath.basename(key),代码应该没问题。

所以最后一行可能会更改为

ftp.storbinary("STOR " + filename, open(filename, 'r'))