Вы можете загружать объекты разными способами: через веб-консоль, API, SDK, а также с помощью консольных утилит.
В Object Storage выделяются два вида загрузки: простая и составная.
Простая загрузка — это метод загрузки, при котором один объект загружается в Object Storage за одну операцию. Этот метод отличается простотой и хорошо подходит для объектов небольшого размера.
При загрузке объекта можно указать его класс хранения . Классы хранения тарифицируются по-разному.
Класс хранения, явно указанный для загружаемого объекта, имеет приоритет над классом хранения, заданным по умолчанию на уровне бакета. Это означает, что в бакет с классом хранения WARM можно загрузить объект с классом хранения STANDARD и наоборот.
Веб-консоль AWS CLI Python Go
В
веб-консоли выберите нужный проект.
В списке сервисов выберите Object Storage .
Нажмите на имя нужного бакета.
Если вам нужно загрузить объект в конкретную папку, нажмите на нее. Если папка еще не создана,
создайте ее .
Нажмите кнопку Загрузить .
Выберите на локальном компьютере нужный файл и нажмите кнопку Открыть . Также файл можно просто перетащить в форму загрузки.
Примечание
Через веб-консоль можно загружать объекты размером не более 5ГБ. Подробнее…
aws s3 cp <путь_к_локальному_файлу>/ s3://<имя_бакета>/<ключ_объекта>
Для загрузки объектов с указанием класса хранения используйте команду aws s3api put-object:
--body <путь к локальному файлу> \
--storage-class < ( опционально ) класс хранения — STANDARD или WARM>
Приведенный код на Python:
Импортирует библиотеку boto3 — официальный AWS SDK для Python.
Создает сессию с использованием профиля по умолчанию, который хранится в файле ~/.aws/credentials.
Создает клиент с использованием созданной сессии.
Вызывает метод upload_file и загружает указанный файл в бакет в качестве объекта с указанным именем.
session = boto3.session. Session ( profile_name = ' default ' )
endpoint_url = ' https://storage.mwsapis.ru/ '
# ExtraArgs={'StorageClass': '<(опционально) класс хранения — STANDARD или WARM>'}
Приведенный код на Go:
Импортирует необходимые пакеты, включая AWS SDK для Go.
Получает из аргументов командной строки путь к файлу для загрузки в Object Storage и имя бакета, в который нужно загрузить этот файл.
Подгружает конфигурацию из ~/.aws/*.
Создает клиент для доступа к Object Storage.
Загружает файл в указанный бакет.
Выводит сообщение об успешной загрузке.
" github.com/aws/aws-sdk-go-v2/aws "
" github.com/aws/aws-sdk-go-v2/config "
" github.com/aws/aws-sdk-go-v2/service/s3 "
// Получаем имя бакета из аргумента командной строки
bucketName := flag . String ( " b " , "" , " The name of the bucket " )
// Получаем из аргумента командной строки имя файла, который нужно загрузить в Object Storage
filePath := flag . String ( " f " , "" , " Path to the file to upload " )
fmt . Println ( " You must supply the name of a bucket (-b BUCKET) " )
fmt . Println ( " You must supply the path to a file " )
// Подгружаем конфигурацию из ~/.aws/*
cfg , err := config . LoadDefaultConfig ( context . TODO ())
// Создаем клиент для доступа к Object Storage
client := s3 . NewFromConfig ( cfg )
file , err := os . Open ( * filePath )
log . Fatalf ( " Unable to open file %q , %v " , * filePath , err )
uploadInput := & s3.PutObjectInput{
Bucket : aws . String ( * bucketName ),
Key : aws . String ( filepath . Base ( * filePath )), // Имя файла в S3
_ , err = client . PutObject ( context . TODO (), uploadInput )
log . Fatalf ( " Unable to upload %q to %q , %v " , * filePath , * bucketName , err )
fmt . Printf ( " Successfully uploaded %q to %q \n " , * filePath , * bucketName )
Составная загрузка — это загрузка объекта не целиком, а по частям. Этот вид загрузки используется для объектов большого размера и имеет следующие преимущества:
вы можете загружать части параллельно, что ускоряет процесс загрузки;
если возникают ошибки сети, требуется повторная загрузка ранее не загруженных частей, а не объекта целиком;
вы можете приостановить и возобновить загрузку в любой момент.
При загрузке объекта можно указать его класс хранения . Классы хранения тарифицируются по-разному.
Класс хранения, явно указанный для загружаемого объекта, имеет приоритет над классом хранения, заданным по умолчанию на уровне бакета. Это означает, что в бакет с классом хранения WARM можно загрузить объект с классом хранения STANDARD и наоборот.
Этапы составной загрузки
Процесс составной загрузки состоит из следующих этапов:
Инициализация . Пользователь отправляет запрос на инициализацию составной загрузки для указанного объекта. В ответ Object Storage возвращает идентификатор загрузки (upload ID), который используется для идентификации этой составной загрузки в последующих запросах.
Загрузка частей . Пользователь загружает части объекта отдельными запросами. Каждой части должен быть присвоен уникальный номер. Части могут быть загружены в любом порядке и параллельно для повышения производительности. После успешной загрузки каждой части Object Storage возвращает контрольную сумму (ETag) для этой части.
Завершение . После загрузки всех частей пользователь отправляет запрос на завершение составной загрузки, указывая идентификатор загрузки и список загруженных частей с их номерами и контрольными суммами. Object Storage объединяет все части в единый объект и возвращает окончательную контрольную сумму для объекта.
Чтобы загрузить объект большого размера по частям с помощью AWS CLI:
Создайте составную загрузку:
aws s3api create-multipart-upload \
--storage-class < ( опционально ) класс хранения — STANDARD или WARM>
В ответе API Object Storage вернет JSON-объект, включающий идентификатор составной загрузки (поле UploadId):
"ServerSideEncryption" : " AES256 " ,
"UploadId" : " 000628088DD8F79E "
Скопируйте и сохраните полученный идентификатор загрузки.
Загрузите первую часть объекта:
aws s3api upload-part --bucket bucket --key large_file --part-number 1 --body large_file.001 --upload-id 000628088DD8F79E
В ответе API Object Storage вернет ETag для загруженной части. Скопируйте и сохраните его.
Повторите предыдущий шаг для всех остальных частей.
Совет
Части объекта не обязательно нумеровать строго по порядку. Можно дать им любые произвольные номера в порядке возрастания – например, 1, 7 и 13.
Когда вы загрузите все части, создайте JSON-файл с перечнем частей:
"ETag" : " 8be9a0268ebfb8b115d4c1fd3 " ,
"ETag" : " 246e31ab807da6f62802c1ae8 " ,
Завершите составную загрузку:
aws s3api complete-multipart-upload --multipart-upload fileparts.json --bucket bucket --key large_file --upload-id 000628088DD8F79E
Если загрузка завершится без ошибок, вы получите ответ вида:
"ETag" : " \\ 000628088DD8F79E \\ " ,
"Location" : " https://storage.mwsapis.ru/large_file " ,
Приведенный код на Python:
Импортирует библиотеку boto3 — официальный AWS SDK для Python.
Создает сессию с использованием профиля по умолчанию, который хранится в файле ~/.aws/credentials.
Создает клиент с использованием созданной сессии.
Вызывает метод upload_fileobj и выполняет составную загрузку.
from botocore.config import Config
# Создаем сессию с указанием профиля по умолчанию
session = boto3.session. Session ( profile_name = ' default ' )
endpoint_url = ' https://storage.mwsapis.ru/ ' ,
config = Config ( s3 = { ' payload_signing_enabled ' : True } ) # Включаем подпись полезной нагрузки для совместимости с конечной точкой
# Путь к локальному файлу
FILE_NAME = ' path/to/file.ext '
# Имя бакета и объекта в S3
# Открываем локальный файл в бинарном режиме
with open ( FILE_NAME , ' rb ' ) as file :
# Выполняем составную загрузку файла в S3
# ExtraArgs={'StorageClass': '<(опционально) класс хранения — STANDARD или WARM>'}
print ( f 'Successfully uploaded {FILE_NAME} to {BUCKET_NAME} / {OBJECT_NAME} ' )
Приведенный код на Go:
Импортирует необходимые пакеты, в том числе официальный AWS SDK для Go.
Получает из аргументов командной строки путь к файлу для загрузки в Object Storage и имя бакета, в который нужно загрузить этот файл.
Подгружает конфигурацию из ~/.aws/*.
Создает клиент для доступа к Object Storage.
Выполняет составную загрузку файла в Object Storage.
Выводит сообщение об успешной загрузке.
" github.com/aws/aws-sdk-go-v2/aws "
" github.com/aws/aws-sdk-go-v2/config "
" github.com/aws/aws-sdk-go-v2/service/s3 "
" github.com/aws/aws-sdk-go-v2/feature/s3/manager "
// "github.com/aws/aws-sdk-go-v2/service/s3/types" // Опциональный импорт для указания классов хранения
// Получаем имя бакета из аргумента командной строки
bucketName := flag . String ( " b " , "" , " The name of the bucket " )
filePath := flag . String ( " f " , "" , " Path to the file to upload " )
fmt . Println ( " You must supply the name of a bucket (-b BUCKET) " )
fmt . Println ( " You must supply the path to a file " )
// Подгружаем конфигурацию из ~/.aws/*
cfg , err := config . LoadDefaultConfig ( context . TODO ())
// Создаем клиент для доступа к Object Storage
client := s3 . NewFromConfig ( cfg )
file , err := os . Open ( * filePath )
log . Fatalf ( " Unable to open file %q , %v " , * filePath , err )
// Создаем составную загрузку
uploader := manager . NewUploader ( client )
response , err := uploader . Upload ( context . TODO (), & s3.PutObjectInput{
Bucket : aws . String ( * bucketName ),
Key : aws . String ( filepath . Base ( * filePath )),
// StorageClass: types.StorageClass("<(опционально) класс хранения — STANDARD или WARM>")
log . Fatalf ( " Unable to upload %q to %q , %v " , * filePath , * bucketName , err )
fmt . Printf ( " Successfully uploaded %q to %q , %+v \n " , * filePath , * bucketName , response )
aws s3api list-multipart-uploads --bucket <имя бакета>
Пример вывода
"UploadId": "000642C7293793E4",
"Key": "large_file_20gb.bin",
"Initiated": "2025-11-17T09:42:09+00:00",
"StorageClass": "STANDARD",
"ChecksumAlgorithm": "CRC32"
Приведенный код на Python:
Импортирует необходимые пакеты, в том числе библиотеку boto3 – официальный AWS SDK для Python.
Определяет функцию list_multipart_uploads, которая выводит список незавершенных загрузок для указанного бакета.
Получает из аргумента командной строки имя бакета, для которого нужно просмотреть список незавершенных составных загрузок.
Вызывает функцию list_multipart_uploads для указанного бакета.
Выводит общее число незавершенных составных загрузок.
Для каждой незавершенной загрузки выводит следующую информацию:
from datetime import datetime
def list_multipart_uploads ( bucket_name ) :
# Cоздаем клиент для подключения к Object Storage
response = s3. list_multipart_uploads ( Bucket = bucket_name )
if ' Uploads ' in response:
print ( f "Currently running uploads in the bucket ' {bucket_name} ':" )
print ( f "Total: { len ( response [ ' Uploads ' ]) } \n " )
for upload in response[ ' Uploads ' ]:
print ( f "Key: {upload [ ' Key ' ] } " )
print ( f "Upload ID: {upload [ ' UploadId ' ] } " )
print ( f "Started at: {upload [ ' Initiated ' ] . strftime ( ' %Y-%m- %d %H:%M:%S ' ) } " )
print ( " No running uploads found " )
# Создаем парсер аргументов
parser = argparse. ArgumentParser ( description = ' List multipart uploads in a bucket ' )
parser. add_argument ( ' bucket ' , help = ' S3 bucket name ' )
args = parser. parse_args ()
# Вызываем функцию с переданным именем бакета
list_multipart_uploads ( args.bucket )
if __name__ == " __main__ " :
Приведенный код на Go:
Импортирует необходимые пакеты, в том числе официальный AWS SDK для Go.
Получает из аргумента командной строки имя бакета, для которого нужно получить список незаверенных составных загрузок.
Подгружает конфигурацию из ~/.aws/*.
Создает клиент для доступа к Object Storage.
Получает и выводит следующую информацию о текущих составных загрузках:
" github.com/aws/aws-sdk-go-v2/aws "
" github.com/aws/aws-sdk-go-v2/config "
" github.com/aws/aws-sdk-go-v2/service/s3 "
// Получаем имя бакета из аргумента командной строки
bucketName := flag . String ( " b " , "" , " The name of the bucket " )
fmt . Println ( " You must supply the name of a bucket (-b BUCKET) " )
// Подгружаем конфигурацию из ~/.aws/*
cfg , err := config . LoadDefaultConfig ( context . TODO ())
// Создаем клиент для подключения к Object Storage
client := s3 . NewFromConfig ( cfg )
result , err := client . ListMultipartUploads ( context . TODO (), & s3.ListMultipartUploadsInput{
Bucket : aws . String ( * bucketName ),
fmt . Printf ( " Currently running uploads in the bucket ' %s ': \n " , * bucketName )
fmt . Printf ( " Total: %d \n\n " , len ( result . Uploads ))
for _ , upload := range result . Uploads {
fmt . Printf ( " Object Key: %s \n " , * upload . Key )
fmt . Printf ( " Upload ID: %s \n " , * upload . UploadId )
fmt . Printf ( " Started at: %s \n " , upload . Initiated . Local (). Format ( time . RFC3339 ))
aws s3api abort-multipart-upload --bucket <имя бакета> --key " <ключ объекта> " --upload-id " <идентификатор загрузки "
Приведенный код на Python:
Импортирует необходимые пакеты, в том числе библиотеку boto3 – официальный AWS SDK для Python.
Определяет функцию abort_multipart_upload, которая завершает указанную составную загрузку.
Получает из аргументов командной строки имя бакета, ключ объекта и идентификатор загрузки, которую нужно остановить.
Вызывает функцию abort_multipart_upload.
Выводит сообщение об успешном завершении загрузки.
def abort_multipart_upload ( bucket_name , key , upload_id ) :
s3. abort_multipart_upload (
# Вывод в столбик с помощью многострочной f-строки
Successfully aborted upload:
print ( f "Error aborting upload {key} : {e} " )
parser = argparse. ArgumentParser ( description = ' Abort multipart upload ' )
parser. add_argument ( ' bucket ' , help = ' S3 bucket name ' )
parser. add_argument ( ' key ' , help = ' Object key ' )
parser. add_argument ( ' upload_id ' , help = ' Upload ID ' )
args = parser. parse_args ()
abort_multipart_upload ( args.bucket , args.key , args.upload_id )
if __name__ == " __main__ " :
Импортирует необходимые пакеты, в том числе официальный AWS SDK для Go.
Получает из аргумента командной строки имя бакета, ключ объекта и идентификатор составной загрузки, которую нужно остановить.
Подгружает конфигурацию из ~/.aws/*.
Создает клиент для доступа к Object Storage.
Останавливает указанную незавершенную загрузку.
Выводи сообщение об успешном завершении загрузки.
" github.com/aws/aws-sdk-go-v2/aws "
" github.com/aws/aws-sdk-go-v2/config "
" github.com/aws/aws-sdk-go-v2/service/s3 "
// Получаем имя бакета из аргумента командной строки
bucketName := flag . String ( " b " , "" , " The name of the bucket " )
objectKey := flag . String ( " k " , "" , " The object key " )
uploadId := flag . String ( " i " , "" , " Upload ID " )
fmt . Println ( " You must supply the name of a bucket (-b BUCKET) " )
fmt . Println ( " You must supply the key of an object (-k KEY) " )
fmt . Println ( " You must supply the upload ID (-i UPLOAD_ID) " )
// Подгружаем конфигурацию из ~/.aws/*
cfg , err := config . LoadDefaultConfig ( context . TODO ())
// Создаем клиент для доступа к Object Storage
client := s3 . NewFromConfig ( cfg )
// Останавливаем незавершенную загрузку
_ , err = client . AbortMultipartUpload ( context . TODO (), & s3.AbortMultipartUploadInput{
Bucket : aws . String ( * bucketName ),
Key : aws . String ( * objectKey ),
UploadId : aws . String ( * uploadId ),
log . Fatal ( " Failed to abort multipart upload: " , err )
fmt . Printf ( " Successfully aborted multipart upload: \n " )
fmt . Printf ( " Bucket: %s \n " , * bucketName )
fmt . Printf ( " Object: %s \n " , * objectKey )
fmt . Printf ( " Upload ID: %s \n " , * uploadId )
aws s3api list-multipart-uploads --bucket multipart \
--query ' Uploads[].[Key, UploadId] ' \
while read key uploadid ; do
echo " Stopping upload: $key "
aws s3api abort-multipart-upload \
Приведенный код на Python:
Импортирует необходимые пакеты, в том числе boto3 — официальный AWS SDK для Python.
Определяет функцию abort_all_multipart_uploads, которая:
получает из аргумента командной строки имя бакета;
получает список всех незавершенных загрузок для этого бакета;
выводит список незавершенных загрузок и запрашивает подтверждение остановки;
после подтверждения останавливает все незавершенные загрузки и выводит соответствующее сообщение.
def abort_all_multipart_uploads ( bucket_name ) :
# Создаем клиент для подключения к Object Storage
# Получаем список всех незавершенных загрузок
response = s3. list_multipart_uploads ( Bucket = bucket_name )
if ' Uploads ' not in response or not response[ ' Uploads ' ]:
print ( f "No multipart uploads found in bucket ' {bucket_name} '" )
uploads = response[ ' Uploads ' ]
print ( f "Found { len ( uploads ) } multipart upload(s) in bucket ' {bucket_name} ':" )
# Выводим информацию о загрузках
for i, upload in enumerate ( uploads , 1 ):
print ( f " {i} . Key: {upload [ ' Key ' ] } , Upload ID: {upload [ ' UploadId ' ] } " )
confirm = input ( f " \n Are you sure you want to abort all { len ( uploads ) } upload(s)? (yes/no): " )
if confirm. lower () != ' yes ' :
print ( " Operation cancelled " )
# Останавливаем все загрузки
s3. abort_multipart_upload (
UploadId = upload [ ' UploadId ' ]
print ( f "Successfully aborted: {upload [ ' Key ' ] } " )
print ( f "Failed to abort {upload [ ' Key ' ] } : {e} " )
# Выводим информацию о завершении всех загрузок
print ( f " \n Operation completed. Successfully aborted {success_count} out of { len ( uploads ) } upload(s)" )
parser = argparse. ArgumentParser ( description = ' Abort all multipart uploads in a bucket ' )
parser. add_argument ( ' bucket ' , help = ' S3 bucket name ' )
args = parser. parse_args ()
abort_all_multipart_uploads ( args.bucket )
if __name__ == " __main__ " :
Приведенный код на Go:
Импортирует необходимые пакеты, в том числе официальный AWS SDK для Go.
Получает из аргумента командной строки имя бакета, в котором нужно найти и остановить незавершенные составные загрузки.
Подгружает конфигурацию из ~/.aws/*.
Создает клиент для доступа к Object Storage.
Получает список незавершенных составных загрузок.
Выводит информацию о найденных незавершенных загрузках.
Запрашивает подтверждение остановки незавершенных загрузок.
После подтверждения останавливает все незавершенные загрузки и выводит соответствующее сообщение.
" github.com/aws/aws-sdk-go-v2/aws "
" github.com/aws/aws-sdk-go-v2/config "
" github.com/aws/aws-sdk-go-v2/service/s3 "
// Получаем имя бакета из аргумента командной строки
bucketName := flag . String ( " b " , "" , " The name of the bucket " )
fmt . Println ( " You must supply the name of a bucket (-b BUCKET) " )
// Подгружаем конфигурацию из ~/.aws/*
cfg , err := config . LoadDefaultConfig ( context . TODO ())
// Создаем клиент для подключения к Object Storage
client := s3 . NewFromConfig ( cfg )
// Получаем список составных загрузок
result , err := client . ListMultipartUploads ( context . TODO (), & s3.ListMultipartUploadsInput{
Bucket : aws . String ( * bucketName ),
// Проверяем, есть ли незавершенные загрузки
if len ( result . Uploads ) == 0 {
fmt . Printf ( " No multipart uploads found in bucket ' %s ' \n " , * bucketName )
// Выводим информацию о найденных незавершенных загрузках
fmt . Printf ( " Found %d multipart upload(s) in bucket ' %s ': \n " , len ( result . Uploads ), * bucketName )
for i , upload := range result . Uploads {
fmt . Printf ( " %d . Key: %s , Upload ID: %s \n " , i + 1 , * upload . Key , * upload . UploadId )
// Запрашиваем подтверждение
fmt . Printf ( " \n Are you sure you want to abort all %d upload(s)? (yes/no): " , len ( result . Uploads ))
fmt . Println ( " Operation cancelled " )
// Завершаем все составные загрузки
for _ , upload := range result . Uploads {
_ , err := client . AbortMultipartUpload ( context . TODO (), & s3.AbortMultipartUploadInput{
Bucket : aws . String ( * bucketName ),
Key : aws . String ( * upload . Key ),
UploadId : aws . String ( * upload . UploadId ),
fmt . Printf ( " Failed to abort upload ' %s ': %v \n " , * upload . Key , err )
fmt . Printf ( " Successfully aborted upload: %s \n " , * upload . Key )
// Выводим итоговый результат
fmt . Printf ( " \n Operation completed. Successfully aborted %d out of %d upload(s) \n " ,
successCount , len ( result . Uploads ))