загрузка файла в определенную папку в S3 с помощью boto3
все с моим кодом работает. Единственная ловушка, с которой я сейчас сталкиваюсь, заключается в том, что я не могу указать папку в ведре S3, в которую я хотел бы поместить свой файл. Вот что у меня есть:
s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>', filename)
Я пробовал так:
s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>/folder/', filename)
и:
s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>', '/folder/'+filename)
Если у кого есть какие-либо советы о том, как направить в определенную папку (если это возможно) пожалуйста, дайте мне знать!
3 ответов
вам не нужно передавать значение ключа как абсолютный путь. Должно работать следующее:
upload_file('/tmp/' + filename, '<bucket-name>', 'folder/{}'.format(filename))
Я понял свою проблему. У меня была правильная идея с /folder/
опция в области ключевых параметров, однако, мне не нужен первый /
спасибо всем! Это по существу та же идея, что и предложение hjpotter92 выше.
вот метод, который позаботится о вложенной структуре каталогов и сможет загрузить полный каталог с помощью boto
def upload_directory():
for root, dirs, files in os.walk(settings.LOCAL_SYNC_LOCATION):
nested_dir = root.replace(settings.LOCAL_SYNC_LOCATION, '')
if nested_dir:
nested_dir = nested_dir.replace('/','',1) + '/'
for file in files:
complete_file_path = os.path.join(root, file)
file = nested_dir + file if nested_dir else file
print "[S3_UPLOAD] Going to upload {complete_file_path} to s3 bucket {s3_bucket} as {file}"\
.format(complete_file_path=complete_file_path, s3_bucket=settings.S3_BUCKET, file=file)
s3_client.upload_file(complete_file_path, settings.S3_BUCKET, file)