ожидаемый объект str, bytes или os.PathLike, не dict: TypeError - PullRequest
0 голосов
/ 11 мая 2019

Я получаю сообщение об ошибке при загрузке zip-файла из корзины s3 в папку 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 голосов
/ 11 мая 2019

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'))  
...