FTPS для AWS S3 с ошибкой ftplib и boto3: Fileobj должен реализовать чтение

#python #amazon-s3 #boto3 #ftplib #ftps

#python #amazon-s3 #boto3 #ftplib #ftps

Вопрос:

Я работаю над созданием передачи данных на python с нашего сайта ftps в корзину S3.

 for ftp_file in files_to_upload:
                ftp_file_obj = self.ftp_client.retrbinary('RETR ' ftp_file,open(ftp_file,'wb').write)
                print(ftp_file_obj)
                if self.s3_upload(
                    ftp_file_obj, ftp_file):
                    print('file uploaded to s3')
                    files_to_move.append(ftp_file)
  

Я должен выполнить итерацию по каталогу FTP и загрузить эти файлы в память. Затем мне нужно сохранить этот файл в памяти и перенести его в S3. Я получаю сообщение о том, что Fileobj должен реализовать ошибку чтения, но я не могу понять, почему.

Успешная передача первого найденного файла

У меня есть печать кода ftp_file_obj , и мне странно, что это строковая распечатка успешной передачи. Должно быть, я неправильно использую retrbinary или неправильно сохраняю файл. И да, хотя я действительно хочу, чтобы он был в памяти, я использовал write в этом случае, чтобы убедиться, что файл выглядит так, как ожидалось.

Ответ №1:

Хорошо, понял это. Передайте его в r, который является BytesIO() с помощью r.запишите как обратный вызов в retrbinary. Затем переместите курсор в начало блока данных с помощью r.seek(0) . Затем загрузите. Я не рекомендую использовать библиотеку ftplib, если вы НЕ ДОЛЖНЫ ее использовать. Я должен был сделать все это, потому что от меня требовалось использовать FTP_TLS, а TLS не поддерживается библиотекой paramiko. Я надеюсь, что коллега-гуглер найдет это полезным.

 for ftp_file in files_to_upload:
    s3_partition = self.create_s3_partition(ftp_file)
    r=BytesIO()
    self.ftp_client.retrbinary('RETR ' ftp_file, 
    r.write)
    r.seek(0)
    if self.s3_upload_file_multipart(
        r, s3_partition ftp_file date_long):
        print(ftp_file ' uploaded to s3')
        files_to_move.append(ftp_file)