Ответ 1
Насколько я знаю, нет операции переименования или перемещения, поэтому у меня есть скопировать файл в новое место и удалить старый.
Правильно, это довольно легко сделать для объектов/файлов размером менее 5 ГБ с помощью операции PUT Object - Copy, за которой следует DELETE Object (оба из них поддерживаются в boto, см. copy_key() и delete_key()):
Эта реализация операции PUT создает копию объекта который уже хранится в Amazon S3. Операция копирования PUT одинакова как выполнение GET, а затем PUT. Добавление заголовка запроса, x-amz-copy-source, делает операцию PUT копировать исходный объект в конечный ковш.
Однако это невозможно для объектов/файлов размером более 5 ГБ:
Примечание
[...] Вы создаете копию своего объекта размером до 5 ГБ в одном атомном используя этот API. Однако для копирования объекта, большего, чем 5 ГБ, вы должны использовать API многостраничной загрузки. Для концептуальных информация [...], перейдите к Загрузка объектов с помощью загрузки многостраничных файлов [...] [акцент мой]
Boto поддерживает это также с помощью метода copy_part_from_key(); к сожалению, требуемый подход не документируется вне соответствующего запроса pull # 425 (разрешить многокомпонентные команды копирования) (я еще не пробовал это сам)
import boto
s3 = boto.connect_s3('access', 'secret')
b = s3.get_bucket('destination_bucket')
mp = b.initiate_multipart_upload('tmp/large-copy-test.mp4')
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 1, 0, 999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 2, 1000000000, 1999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 3, 2000000000, 2999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 4, 3000000000, 3999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 5, 4000000000, 4999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 6, 5000000000, 5500345712)
mp.complete_upload()
Возможно, вам захочется изучить соответствующие образцы о том, как добиться этого в Java или .NET в конечном итоге, что может обеспечить более глубокое понимание общего подхода, см. Копирование объектов с помощью многостраничной загрузки API.
Удачи!
Приложение
Обратите внимание на следующую особенность копирования в целом, которую легко упустить:
При копировании объекта вы можете сохранить большинство метаданных (по умолчанию) или указать новые метаданные. Однако ACL не сохраняется и для пользователя, делающего запрос, назначается частным. Чтобы переопределить по умолчанию ACL, используйте заголовок x-amz-acl, чтобы указать новый ACL при генерации запроса на копирование. Для получения дополнительной информации см. Amazon S3 Списки управления доступом. [акцент мой]