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