[Документация Yandex Cloud](../../../index.md) > [Yandex Object Storage](../../index.md) > [Пошаговые инструкции](../index.md) > Объекты > Загрузка объекта

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

Пользователь может создавать внутри бакета папки и загружать туда объекты. При этом необходимо помнить, что в SDK и HTTP API ключом объекта будет весь путь к объекту от корня бакета. Читайте подробнее в разделе [Объект](../../concepts/object.md).

{% note info %}

Через консоль управления нельзя загрузить объекты размером более 5 ГБ (подробнее на странице [Квоты и лимиты в Object Storage](../../concepts/limits.md)). Также при загрузке через консоль нельзя указать `content-type` и другие заголовки. Для загрузки больших объектов или указания заголовков объекта используйте другие [инструменты](../../tools/index.md).

{% endnote %}

Для загрузки объектов в бакет вы можете использовать [инструменты](../../tools/index.md), поддерживающие работу с Object Storage, а также [подписанные URL-ссылки](../../concepts/pre-signed-urls.md).

## Простая загрузка {#simple}


Чтобы работать с объектами в [зашифрованном](../../concepts/encryption.md) бакете, у пользователя или [сервисного аккаунта](../../../iam/concepts/users/service-accounts.md) вместе с [ролью](../../security/index.md#storage-configurer) `storage.configurer` должны быть следующие [роли на ключ шифрования](../../../kms/operations/key-access.md):

* `kms.keys.encrypter` — для чтения ключа, [шифрования](../../../kms/security/index.md#kms-keys-encrypter) и загрузки объектов;
* `kms.keys.decrypter` — для чтения ключа, [расшифровки](../../../kms/security/index.md#kms-keys-decrypter) и скачивания объектов;
* `kms.keys.encrypterDecrypter` — включает [разрешения](../../../kms/security/index.md#kms-keys-encrypterDecrypter), предоставляемые ролями `kms.keys.encrypter` и `kms.keys.decrypter`.

Подробнее смотрите [Сервисные роли Key Management Service](../../../kms/security/index.md#service-roles).


{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог.
  1. [Перейдите](https://kz.console.yandex.cloud/link/storage) в сервис **Object Storage**.
  1. Выберите бакет, в который нужно загрузить объект.
  1. На панели слева выберите ![image](../../../_assets/console-icons/folder-tree.svg) **Объекты**.
  1. Если вы хотите загрузить объект в бакет впервые, нажмите **Загрузить объекты**.
  1. Если вы хотите загрузить объект в конкретную папку, перейдите в нее, нажав на имя. Если вам нужно создать новую папку, нажмите **Создать папку**.
  1. Оказавшись в нужной папке, на верхней панели нажмите ![image](../../../_assets/console-icons/arrow-up-from-line.svg) **Загрузить**.
  1. В появившемся окне выберите необходимые файлы и нажмите **Открыть**.
  1. Консоль управления отобразит все объекты, выбранные для загрузки и предложит для каждого из них выбрать [класс хранилища](../../concepts/storage-class.md). Класс хранилища по умолчанию определяется [настройкой бакета](../../concepts/bucket.md#bucket-settings).
  1. Нажмите **Загрузить**.
  1. Обновите страницу.

  В консоли управления информация о количестве объектов в бакете и занятом месте обновляется с задержкой в несколько минут.

- Yandex Cloud CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  1. Посмотрите описание команды CLI для загрузки файла в бакет:
  
      ```bash
      yc storage s3api put-object --help
      ```
  
  1. Получите список бакетов в каталоге по умолчанию:
     
     ```bash
     yc storage bucket list
     ```
     
     Результат:
     
     ```text
     +------------------+----------------------+-------------+-----------------------+---------------------+
     |       NAME       |      FOLDER ID       |  MAX SIZE   | DEFAULT STORAGE CLASS |     CREATED AT      |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     | first-bucket     | b1gmit33ngp6******** | 53687091200 | STANDARD              | 2022-12-16 13:58:18 |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     ```
  1. Выполните команду:
  
      ```bash
      yc storage s3api put-object \
        --body <путь_к_локальному_файлу> \
        --bucket <имя_бакета> \
        --key <путь_к_объекту>
      ```
  
      Где:
  
      * `--body` — путь к файлу, который нужно загрузить в бакет.
      * `--bucket` — имя вашего бакета.
      * `--key` — [ключ](../../concepts/object.md#key), по которому объект будет храниться в бакете.
  
      Результат:
  
      ```text
      etag: '"d41d8cd98f00b204e980099********"'
      request_id: 3f2705f********
      ```
  
      Альтернативная команда:
  
      ```bash
      yc storage s3 cp \
        <путь_к_локальному_файлу> \
        s3://<имя_бакета>/<путь_к_объекту>
      ```
  
      Результат:
  
      ```text
      upload: object.txt to s3://my-bucket/object.txt
      ```
  
      {% cut "Настройка параметров для команды `yc storage s3 cp`" %}
  
      Вы можете настроить следующие параметры для команды `yc storage s3 cp`:
      
      * `s3.max-queue-size` — максимальное количество задач в очереди. Значение по умолчанию — `1000`.
      * `s3.max-concurrent-requests` — максимальное количество одновременных запросов. Значение по умолчанию — `10`.
      * `s3.multipart-threshold` — пороговый размер объекта, при превышении которого будет использоваться составная (multipart) загрузка. Значение по умолчанию — `8MB`.
      * `s3.multipart-chunksize` — размер частей, на которые будет делиться объект при составной (multipart) загрузке. Значение по умолчанию — `8MB`.
      
      Чтобы задать эти параметры, используйте команду `yc config set <параметр> <значение>`.
  
      {% endcut %}

- AWS CLI {#aws-cli}

  1. Если у вас еще нет AWS CLI, [установите и сконфигурируйте его](../../tools/aws-cli.md).
  1. Чтобы загрузить один объект, выполните команду:

     ```bash
     aws --endpoint-url=https://storage.yandexcloud.kz/ \
       s3 cp <путь_к_локальному_файлу> s3://<имя_бакета>/<ключ_объекта>
     ```

     Где:

     * `--endpoint-url` — эндпоинт Object Storage.
     * `s3 cp` — команда для загрузки объекта. Чтобы загрузить объект, в первой части команды укажите путь к локальному файлу, который нужно загрузить, а во второй — имя вашего бакета и [ключ](../../concepts/object.md#key), по которому объект будет храниться в бакете.

     Чтобы загрузить все объекты из локальной директории, используйте команду:
   
     ```bash
     aws --endpoint-url=https://storage.yandexcloud.kz/ \
       s3 cp --recursive <путь_к_локальной_директории>/ s3://<имя_бакета>/<префикс>/
     ```
   
     Где:
   
     * `--endpoint-url` — эндпоинт Object Storage.
     * `s3 cp --recursive` — команда для загрузки всех объектов из локальной директории, включая вложенные. Чтобы загрузить объекты, в первой части команды укажите путь к папке, из которой нужно скопировать файлы в бакет, а во второй — имя вашего бакета и [идентификатор папки](../../concepts/object.md#folder) в хранилище.

  Команда `aws s3 cp` — высокоуровневая, ее функциональность ограничена. Подробнее в [справочнике AWS CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html). Все возможности загрузки, которые поддерживаются в Object Storage, можно использовать при выполнении команды [aws s3api put-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-object.html) (читайте [ниже](#w-object-lock) примеры работы с [блокировками](../../concepts/object-lock.md)).

- Terraform {#tf}

  {% note info %}
  
  Если вы работаете с Object Storage через Terraform от имени [сервисного аккаунта](../../../iam/concepts/users/service-accounts.md), [назначьте](../../../iam/operations/sa/assign-role-for-sa.md) сервисному аккаунту нужную [роль](../../security/index.md#roles-list), например `storage.admin`, на каталог, в котором будут создаваться ресурсы.
  
  {% endnote %}

  [Terraform](https://www.terraform.io/) позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.
  
  Terraform распространяется под лицензией [Business Source License](https://github.com/hashicorp/terraform/blob/main/LICENSE), а [провайдер Yandex Cloud для Terraform](https://github.com/yandex-cloud/terraform-provider-yandex) — под лицензией [MPL-2.0](https://www.mozilla.org/en-US/MPL/2.0/).
  
  Подробная информация о ресурсах провайдера в документации на сайте [Terraform](https://www.terraform.io/docs/providers/yandex/index.html) или в [зеркале](../../../terraform/index.md).

  Если у вас еще нет Terraform, [установите его и настройте провайдер Yandex Cloud](../../../tutorials/infrastructure-management/terraform-quickstart.md#install-terraform).
  
  
  Чтобы управлять инфраструктурой с помощью Terraform от имени сервисного аккаунта или пользовательских аккаунтов: аккаунта на Яндексе, федеративного аккаунта и локального пользователя, [аутентифицируйтесь](../../../terraform/authentication.md) соответствующим способом.

  Перед началом работы получите [статические ключи доступа](../../../iam/operations/authentication/manage-access-keys.md#create-access-key) — секретный ключ и идентификатор ключа, используемые для аутентификации в Object Storage.

  {% note info %}
  
  Кроме статических ключей доступа для аутентификации в Object Storage можно использовать IAM-токен. Подробнее смотрите в разделе [Создание бакета](../buckets/create.md) и в [документации провайдера](../../../terraform/resources/storage_object.md). 
  
  {% endnote %}

  
  {% note warning %}
  
  Для корректной работы Terraform в [регионе Казахстан](../../../overview/concepts/region.md) укажите в конфигурационном файле Terraform в блоке `provider` эндпоинты API Yandex Cloud и Object Storage: 
  
  ```hcl
  provider "yandex" {
    zone             = "kz1-a"
    endpoint         = "api.yandexcloud.kz:443"
    storage_endpoint = "https://storage.yandexcloud.kz"
  }
  ```
  
  Подробнее о настройках провайдера в разделе [Настройте провайдер](../../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider).
  
  {% endnote %}


  Чтобы создать объект в существующем бакете:

  1. Опишите в конфигурационном файле параметры ресурсов, которые необходимо создать.

     ```hcl
     # Создание сервисного аккаунта

     resource "yandex_iam_service_account" "sa" {
       name = "<имя_сервисного_аккаунта>"
     }

     # Назначение роли сервисному аккаунту

     resource "yandex_resourcemanager_folder_iam_member" "sa-admin" {
       folder_id = "<идентификатор_каталога>"
       role      = "storage.admin"
       member    = "serviceAccount:${yandex_iam_service_account.sa.id}"
     }

     # Создание статического ключа доступа
     
     resource "yandex_iam_service_account_static_access_key" "sa-static-key" {
       service_account_id = yandex_iam_service_account.sa.id
       description        = "static access key for object storage"
     }

     # Создание объекта

     resource "yandex_storage_object" "test-object" {
       access_key = yandex_iam_service_account_static_access_key.sa-static-key.access_key
       secret_key = yandex_iam_service_account_static_access_key.sa-static-key.secret_key
       bucket     = "<имя_бакета>"
       key        = "<имя_объекта>"
       source     = "<путь_к_файлу>"
     }
     ```

     Где:
     * `access_key` — идентификатор статического ключа доступа.
     * `secret_key` — значение секретного ключа доступа.
     * `bucket` — имя бакета для добавления объекта. Обязательный параметр.
     * `key` — имя объекта в бакете. Обязательный параметр. Формат имени:

        * длина — от 3 до 63 символов;
        * может содержать строчные буквы латинского алфавита, цифры и дефисы;
        * первый символ — буква, последний — не дефис.

     * `source` — относительный или абсолютный путь к файлу, который нужно загрузить в бакет.

      Более подробная информация о параметрах ресурса `yandex_storage_object` в Terraform приведена в [документации провайдера](../../../terraform/resources/storage_object.md).

  1. Создайте ресурсы:

     1. В терминале перейдите в директорию с конфигурационным файлом.
     1. Проверьте корректность конфигурации с помощью команды:
     
        ```bash
        terraform validate
        ```
     
        Если конфигурация является корректной, появится сообщение:
     
        ```bash
        Success! The configuration is valid.
        ```
     
     1. Выполните команду:
     
        ```bash
        terraform plan
        ```
     
        В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
     1. Примените изменения конфигурации:
     
        ```bash
        terraform apply
        ```
     
     1. Подтвердите изменения: введите в терминале слово `yes` и нажмите **Enter**.

     После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в [консоли управления](https://kz.console.yandex.cloud).

- API {#api}

  Чтобы загрузить объект, воспользуйтесь методом S3 API [upload](../../s3/api-ref/object/upload.md).

  Подробнее читайте на странице [Начало работы с AWS S3 API в Yandex Object Storage](../../s3/s3-api-quickstart.md).

{% endlist %}

## Загрузка версии объекта с блокировкой (object lock) {#w-object-lock}

Если в бакете включены [версионирование](../buckets/versioning.md) и [блокировки версий объектов](../buckets/configure-object-lock.md), вы можете указать настройки блокировки (запрета на удаление или перезапись) при загрузке версии объекта.

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог.
  1. [Перейдите](https://kz.console.yandex.cloud/link/storage) в сервис **Object Storage**.
  1. Выберите бакет, в который нужно загрузить объект.
  1. На панели слева выберите ![image](../../../_assets/console-icons/folder-tree.svg) **Объекты**.
  1. Если вы хотите загрузить объект в бакет впервые, нажмите **Загрузить объекты**.
  1. Если вы хотите загрузить объект в конкретную папку, перейдите в нее, нажав на имя. Если хотите создать новую папку, создайте ее, нажав на панели сверху **Создать папку**.
  1. Оказавшись в нужной папке, нажмите на верхней панели ![image](../../../_assets/console-icons/arrow-up-from-line.svg) **Загрузить**.
  1. В появившемся окне выберите необходимые файлы и нажмите **Открыть**.
  1. Консоль управления отобразит все объекты, выбранные для загрузки и предложит для каждого из них выбрать [класс хранилища](../../concepts/storage-class.md) (стандартное, холодное, ледяное). Класс хранилища по умолчанию определяется [настройкой бакета](../../concepts/bucket.md#bucket-settings).
  1. Чтобы настроить блокировку загружаемых объектов, в выпадающем списке **Блокировка версии объекта** выберите вид блокировки:
     * **Бессрочная блокировка** — блокировка бессрочно запрещает удаление или перезапись версии объекта, но при этом не запрещает загружать новые версии объекта. Пользователь с ролью `storage.uploader` может установить и снять блокировку. Обойти блокировку нельзя. В сочетании с временной блокировкой имеет приоритет.
     * **Временная блокировка** — блокировка запрещает удаление или перезапись версии объекта на определенный срок, но при этом не запрещает загружать новые версии объекта. Пользователь с ролью `storage.uploader` может установить блокировку. В сочетании с бессрочной блокировкой не имеет приоритета.
  1. Если вы выбрали вид **Временная блокировка**, укажите **Тип блокировки по умолчанию**:
     * **Временная управляемая (governance)** — пользователь с ролью `storage.admin` может обойти блокировку, изменить ее срок или снять ее.
     * **Временная строгая (compliance)** — пользователь с ролью `storage.admin` может только продлить блокировку. Обойти, сократить или снять блокировку до ее окончания нельзя.
  1. Установите **Срок блокировки по умолчанию** в днях или годах. Отсчитывается от момента, когда версия объекта загружена в бакет.
  1. Нажмите **Загрузить** и обновите страницу.

  В консоли управления информация о количестве объектов в бакете и занятом месте обновляется с задержкой в несколько минут.

- Yandex Cloud CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  1. Посмотрите описание команды CLI для загрузки файла в бакет:

      ```bash
      yc storage s3api put-object --help
      ```

  1. Получите список бакетов в каталоге по умолчанию:
     
     ```bash
     yc storage bucket list
     ```
     
     Результат:
     
     ```text
     +------------------+----------------------+-------------+-----------------------+---------------------+
     |       NAME       |      FOLDER ID       |  MAX SIZE   | DEFAULT STORAGE CLASS |     CREATED AT      |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     | first-bucket     | b1gmit33ngp6******** | 53687091200 | STANDARD              | 2022-12-16 13:58:18 |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     ```
  1. Выполните команду:

      ```bash
      yc storage s3api put-object \
       --body <путь_к_локальному_файлу> \
       --bucket <имя_бакета> \
       --key <ключ_объекта> \
       --object-lock-mode <тип_временной_блокировки> \
       --object-lock-retain-until-date <дата_и_время_окончания_временной_блокировки> \
       --object-lock-legal-hold-status <статус_бессрочной_блокировки>
      ```

     Где:

     * `--body` — путь к файлу, который нужно загрузить в бакет.
     * `--bucket` — имя вашего бакета.
     * `--key` — [ключ](../../concepts/object.md#key), по которому объект будет храниться в бакете.
     * `--object-lock-mode` — [тип](../../concepts/object-lock.md#types) временной блокировки:

       * `GOVERNANCE` — временная управляемая блокировка.
       * `COMPLIANCE` — временная строгая блокировка.
  
     * `--object-lock-retain-until-date` — дата и время окончания временной блокировки в любом из форматов, описанных в [стандарте HTTP](https://www.rfc-editor.org/rfc/rfc9110#name-date-time-formats). Например, `2025-01-02T15:04:05Z`. Указывается только вместе с параметром `--object-lock-mode`.
  
     * `--object-lock-legal-hold-status` — статус [бессрочной блокировки](../../concepts/object-lock.md#types):
  
       * `ON` — блокировка установлена.
       * `OFF` — блокировка не установлена.

     Вы можете установить на версию объекта только временную блокировку (параметры `object-lock-mode` и `object-lock-retain-until-date`), только бессрочную блокировку (`object-lock-legal-hold-status`) или обе сразу. Подробнее об их совместной работе в разделе [Типы блокировок](../../concepts/object-lock.md#types).

     Результат:

     ```bash
     etag: '"d41d8cd98f00b204e9800998********"'
     request_id: e19afe50********
     version_id: 0006241E********
     ```

- AWS CLI {#aws-cli}

  1. Если у вас еще нет AWS CLI, [установите и сконфигурируйте его](../../tools/aws-cli.md).
  1. Выполните команду:

     ```bash
     aws --endpoint-url=https://storage.yandexcloud.kz/ \
       s3api put-object \
       --body <путь_к_локальному_файлу> \
       --bucket <имя_бакета> \
       --key <ключ_объекта> \
       --object-lock-mode <тип_временной_блокировки> \
       --object-lock-retain-until-date <дата_и_время_окончания_временной_блокировки> \
       --object-lock-legal-hold-status <статус_бессрочной_блокировки>
     ```
     
     Где:
   
     * `--endpoint-url` — эндпоинт Object Storage.
     * `s3api put-object` — команда для загрузки версии объекта. Чтобы загрузить версии объекта с блокировкой, укажите следующие параметры:
       * `--body` — путь к файлу, который нужно загрузить в бакет.
       * `--bucket` — имя вашего бакета.
       * `--key` — [ключ](../../concepts/object.md#key), по которому объект будет храниться в бакете.
       * `--object-lock-mode` — [тип](../../concepts/object-lock.md#types) временной блокировки:
   
         * `GOVERNANCE` — временная управляемая блокировка.
         * `COMPLIANCE` — временная строгая блокировка.
    
       * `--object-lock-retain-until-date` — дата и время окончания временной блокировки в любом из форматов, описанных в [стандарте HTTP](https://www.rfc-editor.org/rfc/rfc9110#name-date-time-formats). Например, `Mon, 12 Dec 2022 09:00:00 GMT`. Указывается только вместе с параметром `--object-lock-mode`.
    
       * `--object-lock-legal-hold-status` — статус [бессрочной блокировки](../../concepts/object-lock.md#types):
    
         * `ON` — блокировка установлена.
         * `OFF` — блокировка не установлена.
    
     Вы можете установить на версию объекта только временную блокировку (параметры `object-lock-mode` и `object-lock-retain-until-date`), только бессрочную блокировку (`object-lock-legal-hold-status`) или обе сразу. Подробнее об их совместной работе в разделе [Типы блокировок](../../concepts/object-lock.md#types).

- API {#api}

  Чтобы загрузить версию объекта с блокировкой, воспользуйтесь методом S3 API [upload](../../s3/api-ref/object/upload.md) с заголовками `X-Amz-Object-Lock-Mode` и `X-Amz-Object-Lock-Retain-Until-Date` для временной блокировки и `X-Amz-Object-Lock-Legal-Hold` для бессрочной.

{% endlist %}

Если для бакета также настроены [временные блокировки по умолчанию](../../concepts/object-lock.md#default), все объекты в него нужно загружать с указанием их [MD5-хешей](https://ru.wikipedia.org/wiki/MD5):

{% list tabs group=instructions %}

- Yandex Cloud CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  1. Вычислите MD5-хэш файла и закодируйте его по схеме [Base64](https://ru.wikipedia.org/wiki/Base64):

     ```bash
     md5=($(md5sum <путь_к_локальному_файлу>))
     md5_base64=$(echo $md5 | base64)
     ```

  1. Посмотрите описание команды CLI для загрузки файла в бакет:

     ```bash
     yc storage s3api put-object --help
     ```

  1. Получите список бакетов в каталоге по умолчанию:
     
     ```bash
     yc storage bucket list
     ```
     
     Результат:
     
     ```text
     +------------------+----------------------+-------------+-----------------------+---------------------+
     |       NAME       |      FOLDER ID       |  MAX SIZE   | DEFAULT STORAGE CLASS |     CREATED AT      |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     | first-bucket     | b1gmit33ngp6******** | 53687091200 | STANDARD              | 2022-12-16 13:58:18 |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     ```
  1. Загрузите объект в бакет:

     ```bash
      yc storage s3api put-object \
       --body <путь_к_локальному_файлу> \
       --bucket <имя_бакета> \
       --key <ключ_объекта> \
       --content-md5 $md5_base64
     ```

     Где:

     * `--body` — путь к файлу, который нужно загрузить в бакет.
     * `--bucket` — имя вашего бакета.
     * `--key` — [ключ](../../concepts/object.md#key), по которому объект будет храниться в бакете.
     * `--content-md5` — закодированный MD5-хеш объекта.

     Также вы можете добавить к команде параметры:

     * `--object-lock-mode` и `--object-lock-retain-until-date`, чтобы установить на версию объекта временную блокировку, отличную от настроек бакета по умолчанию;
     * `--object-lock-legal-hold-status`, чтобы установить на версию объекта бессрочную блокировку.

     Подробнее об этих параметрах в инструкции выше.

- AWS CLI {#aws-cli}

  1. Вычислите MD5-хэш файла и закодируйте его по схеме [Base64](https://ru.wikipedia.org/wiki/Base64):

     ```bash
     md5=($(md5sum <путь_к_локальному_файлу>))
     md5_base64=$(echo $md5 | base64)
     ```

  1. Если у вас еще нет AWS CLI, [установите и сконфигурируйте его](../../tools/aws-cli.md).
  1. Загрузите объект в бакет:

     ```bash
     aws --endpoint-url=https://storage.yandexcloud.kz/ \
       s3api put-object \
       --body <путь_к_локальному_файлу> \
       --bucket <имя_бакета> \
       --key <ключ_объекта> \
       --content-md5 $md5_base64
     ```
   
     Где:
   
     * `--endpoint-url` — эндпоинт Object Storage.
     * `s3api put-object` — команда для загрузки версии объекта. Чтобы загрузить версии объекта, укажите следующие параметры:
       * `--body` — путь к файлу, который нужно загрузить в бакет.
       * `--bucket` — имя вашего бакета.
       * `--key` — [ключ](../../concepts/object.md#key), по которому объект будет храниться в бакете.
       * `--content-md5` — закодированный MD5-хеш объекта.
     
     Также вы можете добавить к команде параметры:
     
     * `--object-lock-mode` и `--object-lock-retain-until-date`, чтобы установить на версию объекта временную блокировку, отличную от настроек бакета по умолчанию;
     * `--object-lock-legal-hold-status`, чтобы установить на версию объекта бессрочную блокировку.
 
     Подробнее об этих параметрах в инструкции выше.

- API {#api}

  Чтобы загрузить версию объекта с временной блокировкой по умолчанию, воспользуйтесь методом S3 API [upload](../../s3/api-ref/object/upload.md) с заголовком `Content-MD5`.

{% endlist %}


## Условная загрузка объекта (conditional writes) {#conditional-writes}

Вы можете использовать [условия](../../concepts/object.md#conditional-writes) при загрузке объекта, а также при [завершении составной загрузки](multipart-upload.md#conditional-writes).

{% note tip %}

Чтобы сделать проверку условий обязательной, используйте [политику доступа](../../concepts/policy.md#conditional-writes-policy). Смотрите [примеры правил](../../concepts/policy.md#conditional-writes-rules).

{% endnote %}


### Загрузка объекта с условием по ETag {#if-match}

{% list tabs group=instructions %}


- AWS CLI {#aws-cli}

  1. Если у вас еще нет AWS CLI, [установите и сконфигурируйте его](../../tools/aws-cli.md).
  1. Чтобы загрузить объект только при существовании объекта с определенным `ETag`, выполните команду:

      ```bash
      aws s3api put-object \
          --endpoint-url https://storage.yandexcloud.kz \
          --body <путь_к_локальному_файлу> \
          --bucket <имя_бакета> \
          --key <путь_к_объекту> \
          --if-match "<ETag_объекта>"
      ```

      Где:

      * `--endpoint-url` — эндпоинт Object Storage.
      * `--body` — путь к файлу, который нужно загрузить в бакет. Например: `./my-folder/my-file.txt`.
      * `--bucket` — имя вашего бакета.
      * `--key` — [ключ](../../concepts/object.md#key), по которому объект будет храниться в бакете. Например: `my-folder/my-file.txt`.
      * `--if-match` — текущий `ETag` объекта, например `\"d41d8cd98f00b204e9800998********\"`. Запись выполнится, только если по указанному ключу уже существует объект и его текущий `ETag` совпадает.

- API {#api}

  Чтобы загрузить объект только при существовании объекта с определенным `ETag`, воспользуйтесь методом S3 API [upload](../../s3/api-ref/object/upload.md) с заголовком `--if-match`.

{% endlist %}


### Загрузка объекта с условием отсутствия {#if-none-match}

{% list tabs group=instructions %}


- AWS CLI {#aws-cli}

  1. Если у вас еще нет AWS CLI, [установите и сконфигурируйте его](../../tools/aws-cli.md).
  1. Чтобы загрузить объект только при отсутствии в бакете объекта с определенным ключом, выполните команду:

      ```bash
      aws s3api put-object \
          --endpoint-url https://storage.yandexcloud.kz \
          --body <путь_к_локальному_файлу> \
          --bucket <имя_бакета> \
          --key <путь_к_объекту> \
          --if-none-match "*"
      ```

      Где:

      * `--endpoint-url` — эндпоинт Object Storage.
      * `--body` — путь к файлу, который нужно загрузить в бакет. Например: `./my-folder/my-file.txt`.
      * `--bucket` — имя вашего бакета.
      * `--key` — [ключ](../../concepts/object.md#key), по которому объект будет храниться в бакете. Например: `my-folder/my-file.txt`.
      * `--if-none-match` — укажите `"*"`, чтобы запись выполнилась, только если по указанному ключу еще нет объекта.

- API {#api}

  Чтобы загрузить объект только при отсутствии в бакете объекта с определенным ключом, воспользуйтесь методом S3 API [upload](../../s3/api-ref/object/upload.md) с заголовком `--if-none-match`.

{% endlist %}



#### Полезные ссылки {#see-also}

[Подключение к Object Storage из Virtual Private Cloud](../../tutorials/storage-vpc-access.md)