Загрузка и Multipart

Загрузка и копирование объектов, включая параллельный S3 multipart upload больших файлов.

Загрузка объекта

Используйте PutObject для обычной загрузки. Object key — это полный путь после bucket; создавать префиксы директорий отдельно не требуется.

AWS CLI
aws s3 cp ./archive.tar s3://<bucket>/backups/archive.tar \
  --endpoint-url https://storage.acdn.uz \
  --profile acdn

Копирование существующего объекта

  • CopyObject поддерживает копирование внутри одного bucket storage zone.
  • Source-объект может находиться на другой реплике хранилища — gateway разрешает это прозрачно.
  • Максимальный размер source для CopyObject — 5 GiB. Multipart copy через UploadPartCopy не поддерживается.
  • Метаданные можно скопировать или заменить стандартным header x-amz-metadata-directive.

S3 multipart upload

Используйте multipart для больших объектов и загрузок, где важны независимые retry. Обычные S3-клиенты управляют lifecycle без специальных запросов ACDN.

  • Поддерживаются CreateMultipartUpload, UploadPart, CompleteMultipartUpload и AbortMultipartUpload.
  • Части можно загружать параллельно, повторять или заменять повторной загрузкой того же part number.
  • Все части, кроме последней, должны быть не меньше 5 МиБ. Один объект может содержать максимум 10 000 частей.
  • CompleteMultipartUpload требует возрастающий порядок part number и точный ETag каждой загруженной части.
  • AbortMultipartUpload удаляет временные части. Незавершённая загрузка не видна как объект.
  • Итоговый multipart ETag является составным и не должен использоваться как MD5 всего файла.
  • S3 multipart upload — не HTML-запрос multipart/form-data.

Multipart через Laravel Flysystem

Flysystem и AWS SDK автоматически переключаются на multipart выше заданного порога. writeStream() ограничивает потребление памяти приложения.

Laravel Flysystem
Storage::disk('acdn_s3')->writeStream('backups/archive.tar', $stream, [
    'mimetype' => 'application/octet-stream',
    'part_size' => 64 * 1024 * 1024,
]);