---
title: 'Swift'
description: 'Методы Swift API для работы с S3'
---

import { CustomTable } from '@selectel/docux/components'

С помощью Swift API (API на базе OpenStack Object Storage API) вы можете работать с ресурсами S3:

* просматривать информацию о количестве и объеме бакетов и объектов в рамках аккаунта;
* создавать и удалять бакеты;
* управлять лимитами бакетов;
* загружать, просматривать, копировать, перемещать, скачивать и удалять объекты в бакетах.

Для доступа к Swift API у пользователя должна быть роль с доступом к проекту в S3, подробнее в инструкции [Управлять доступом к S3](/s3/about/manage-access/).

## Авторизация \{#authorization}

Авторизация в Swift API происходит с помощью [IAM-токен для проекта](/api/authorization/#iam-token-project-scoped), который передается в каждом запросе в заголовке `X-Auth-Token`.

Адрес (URL) можно посмотреть в [списке URL](/api/urls/).

Пример запроса для просмотра списка бакетов в проекте аккаунта:

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>'
```

Укажите:

* `<x_auth_token>` — [IAM-токен для проекта](/api/authorization/#iam-token-project-scoped);
* `<swift_domain>` — [домен Swift API](/s3/manage/domains/#swift-api-domains) в [пуле](/infrastructure/locations/#pool), в котором находится S3;
* `<project_id>` — идентификатор проекта. Посмотреть идентификатор можно в [панели управления](https://my.selectel.ru/) в разделе **S3** → меню проектов → **Управление проектами**. Идентификатор указан под названием проекта.

## Хранилище \{#storage}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <td>HEAD</td>
        <td>/v1/{'{project_id}'}</td>
        <td><a href="#get-info-about-storage">Получение информации о хранилище</a></td>
      </tr>

      <tr>
        <td>GET</td>
        <td>/v1/{'{project_id}'}</td>
        <td><a href="#get-storage-info-and-list-of-buckets">Получение информации о хранилище и списка бакетов</a></td>
      </tr>

      <tr>
        <td>POST</td>
        <td>/v1/{'{project_id}'}</td>
        <td><a href="#manage-storage-metadata">Управление метаданными хранилища</a></td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Получить информацию о хранилище \{#get-info-about-storage}

Возвращает метаданные с информацией о количестве и объеме хранения бакетов и объектов.

#### Пример запроса \{#get-info-about-storage-request-example}

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>'
```

#### Пример ответа \{#get-info-about-storage-response-example}

В случае успеха запрос возвращает ответ с кодом 204.

```
HTTP/1.1 204 No Content
Content-Length: 0
X-Account-Object-Count: 6
X-Timestamp: 1374058535.42927
X-Account-Meta-Temp-Url-Key: 00000
X-Account-Bytes-Used: 484474
X-Account-Container-Count: 3
X-Account-Meta-<...>: anyheader
X-Openstack-Requiest-Id: 0009ec57-2681-4b48-9105-71c57016edc6
X-Trans-Id: 0009ec57-2681-4b48-9105-71c57016edc6
```

#### Параметры ответа \{#get-info-about-storage-response-parameters}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Параметр</th>
        <th>Значение</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>X-Account-Bytes-Used</td>
        <td>Суммарный объем хранимых данных (в байтах)</td>
      </tr>

      <tr>
        <td>X-Account-Container-Count</td>
        <td>Количество бакетов</td>
      </tr>

      <tr>
        <td>X-Account-Meta-\<...></td>
        <td>Метаданные, где \<...> — пользовательский заголовок</td>
      </tr>

      <tr>
        <td>X-Account-Meta-Temp-Url-Key</td>
        <td>Секретный ключ, который используется для доступа к объектам в приватном бакете через временный URL (при наличии)</td>
      </tr>

      <tr>
        <td>X-Account-Object-Count</td>
        <td>Общее количество хранимых объектов</td>
      </tr>

      <tr>
        <td>X-Account-Storage-Policy-Policy-0-Bytes-Used</td>
        <td>Суммарный объем хранимых данных по политике хранения, где Policy-0 — имя политики</td>
      </tr>

      <tr>
        <td>X-Account-Storage-Policy-Policy-0-Container-Count</td>
        <td>Количество бакетов, которые используют политику хранения, где Policy-0 — имя политики</td>
      </tr>

      <tr>
        <td>X-Account-Storage-Policy-Policy-0-Object-Count</td>
        <td>Количество объектов, которые используют политику хранения, где Policy-0 — имя политики</td>
      </tr>

      <tr>
        <td>X-Openstack-Request-Id<br />X-Trans-Id</td>
        <td>ID запроса</td>
      </tr>

      <tr>
        <td>X-Timestamp</td>
        <td>Дата и время в UNIX-формате, когда был создан аккаунт, бакет или объект</td>
      </tr>

      <tr>
        <td>Date</td>
        <td>Дата и время отправки запроса</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Получить информацию о хранилище и список бакетов \{#get-storage-info-and-list-of-buckets}

Возвращает информацию о хранилище и список бакетов.

Один запрос выводит список, который может содержать до 10 000 бакетов. Если бакетов больше, используйте дополнительные запросы с [query-параметром](#marker) `marker`.

Чтобы получить дополнительную информацию о бакетах (размер, дату обновления и т. д.), используйте [query-параметр](#format) `?format=json`.

#### Пример запроса \{#get-storage-info-and-list-of-buckets-request-example}

```bash
curl \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>'
```

#### Пример ответа \{#get-storage-info-and-list-of-buckets-response-example}

```
bucket1
bucket2
bucket3
```

### Управлять метаданными хранилища \{#manage-storage-metadata}

Устанавливает, заменяет или удаляет метаданные, переданные в заголовке из запроса.

#### Заголовки запроса \{#manage-storage-metadata-request-headers}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <td>Заголовок</td>
        <td>Описание</td>
      </tr>

      <tr>
        <td>X-Account-Meta-\<...></td>
        <td>Метаданные хранилища, которые будут установлены, где \<...> — пользовательский заголовок</td>
      </tr>

      <tr>
        <td>X-Remove-Account-Meta-\<...></td>
        <td>Метаданные хранилища, которые требуется удалить, где \<...> — пользовательский заголовок</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#manage-storage-metadata-request-example}

```bash
curl -i -XPOST \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Account-Meta-<...>: anyheader' \
'https://<swift_domain>/v1/<project_id>'
```

#### Пример ответа \{#manage-storage-metadata-response-example}

В случае успеха запрос возвращает ответ с кодом 204.

## Бакеты \{#buckets}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <td>HEAD</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}</td>
        <td><a href="#get-bucket-metadata">Получение метаданных бакета</a></td>
      </tr>

      <tr>
        <td>GET</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}</td>
        <td><a href="#get-list-of-bucket-objects-and-metadata">Получение списка объектов и метаданных бакета</a></td>
      </tr>

      <tr>
        <td>PUT</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}</td>
        <td><a href="#create-bucket">Создание бакета</a></td>
      </tr>

      <tr>
        <td>POST</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}</td>
        <td><a href="#manage-bucket-metadata">Управление метаданными бакета</a></td>
      </tr>

      <tr>
        <td>DELETE</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}</td>
        <td><a href="#delete-bucket">Удаление бакета</a></td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Получить метаданные бакета \{#get-bucket-metadata}

Выводит метаданные бакета, включая количество объектов, объем хранения (в байтах) и заголовки бакета.

#### Пример запроса \{#get-bucket-metadata-request-example}

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>'
```

#### Пример ответа \{#get-bucket-metadata-response-example}

В случае успеха запрос возвращает ответ с кодом 204.

### Получить список объектов и метаданных бакета \{#get-list-of-bucket-objects-and-metadata}

Возвращает метаданные бакета и выводит список объектов.

Один запрос выводит список, который может содержать до 10 000 объектов. Если объектов больше, используйте дополнительные запросы с query-параметрами [`marker`](#marker) и [`limit`](#limit).

#### Пример запроса \{#get-list-of-bucket-objects-and-metadata-request-example}

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>'
```

#### Пример ответа \{#get-list-of-bucket-objects-and-metadata-response-example}

В случае успеха запрос возвращает ответ с кодом 200 или 204.

```
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/plain
X-Container-Bytes-Used: 0
X-Container-Meta-Quota-Bytes: 52428800
X-Container-Meta-Quota-Count: 1000
X-Container-Meta-Type: public
X-Container-Object-Count: 1
X-Container-Storage-Policy-Index: 0
X-Container-Storage-Policy-Name: Policy-0
X-Openstack-Request-Id: 585ec880-d654-485f-949e-c0dc24926d00
X-Storage-Policy: Policy-0
X-Timestamp: 1688648194.11923
X-Trans-Id: 585ec880-d654-485f-949e-c0dc24926d00
X-Versions-Enabled: true
Date: Thu, 13 Jul 2023 15:13:53 GMT
Content-Length: 120
```

```
Object1
Object2
Object3
```

#### Параметры ответа \{#get-list-of-bucket-objects-and-metadata-response-parameters}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <td>Параметр</td>
        <td>Значение</td>
      </tr>

      <tr>
        <td>X-Container-Object-Count</td>
        <td>Количество объектов в бакете</td>
      </tr>

      <tr>
        <td>X-Container-Bytes-Used</td>
        <td>Объем объектов в бакете (в байтах)</td>
      </tr>

      <tr>
        <td>X-Container-Meta-Type</td>
        <td>Тип бакета</td>
      </tr>

      <tr>
        <td>X-Container-Meta-Quota-Bytes</td>
        <td>Максимальный объем хранения данных (в байтах)</td>
      </tr>

      <tr>
        <td>X-Container-Meta-Quota-Count</td>
        <td>Максимальное количество объектов в бакете</td>
      </tr>

      <tr>
        <td>X-Container-Meta-\<...></td>
        <td>Метаданные бакета, где \<...> — пользовательский заголовок</td>
      </tr>

      <tr>
        <td>X-Versions-Enabled</td>
        <td>Включено ли версионирование бакета</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Создать бакет \{#create-bucket}

Создает бакет с параметрами, указанными в запросе.

#### Заголовки запроса \{#create-bucket-request-headers}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <td>Заголовок</td>
        <td>Описание</td>
      </tr>

      <tr>
        <td>X-Container-Meta-Type</td>
        <td>Тип бакета:<ul><li>public (публичный);</li><li>private (приватный)</li></ul></td>
      </tr>

      <tr>
        <td>X-Container-Meta-\<...></td>
        <td>Метаданные бакета. Укажите {'\\<...>'} — заголовок метаданных</td>
      </tr>

      <tr>
        <td>X-Storage-Policy</td>
        <td>Класс хранения:<ul><li>Policy-0 (по умолчанию) — стандартное хранение;</li><li>cold — холодное хранение</li></ul> </td>
      </tr>

      <tr>
        <td>X-Versions-Enabled</td>
        <td>Включено ли версионирование бакета</td>
      </tr>

      <tr>
        <td>X-Container-Meta-Default-Delete-After</td>
        <td>Срок хранения всех объектов в бакете (в секундах)</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#create-bucket-request-example}

```bash
curl -i -XPUT \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Container-Meta-Type: public' \
-H 'X-Container-Meta-<...>: anyheader' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>'
```

#### Пример ответа \{#create-bucket-response-example}

В случае успеха запрос возвращает ответ с кодом 201.

```
HTTP/1.1 201 Created
Content-Length: 0
Content-Type: text/html
X-Openstack-Requiest-Id: 0009ec57-2681-4b48-9105-71c57016edc6
X-Trans-Id: 0009ec57-2681-4b48-9105-71c57016edc6
```

### Управлять метаданными бакета \{#manage-bucket-metadata}

Устанавливает, заменяет или удаляет метаданные, переданные в заголовке из запроса.

#### Заголовки запроса \{#manage-bucket-metadata-request-header}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <td>Заголовок</td>
        <td>Описание</td>
      </tr>

      <tr>
        <td>X-Container-Meta-Type</td>
        <td>Тип бакета:<ul><li>public (публичный);</li><li>private (приватный)</li></ul></td>
      </tr>

      <tr>
        <td>X-Container-Meta-\<...></td>
        <td>Метаданные бакета, которые будут установлены, где \<...> — пользовательский заголовок</td>
      </tr>

      <tr>
        <td>X-Remove-Container-Meta-\<...></td>
        <td>Метаданные бакета, которые требуется удалить, где \<...> — пользовательский заголовок</td>
      </tr>

      <tr>
        <td>X-Versions-Enabled</td>
        <td>Включено ли версионирование бакета</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#manage-bucket-metadata-request-example}

Изменение типа бакета:

```bash
curl -i -XPOST \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Container-Meta-Type: private' \
-H 'X-Versions-Enabled: true' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>'
```

#### Пример ответа \{#manage-bucket-metadata-response-example}

В случае успеха запрос возвращает ответ с кодом 204.

### Удалить бакет \{#delete-bucket}

Удаляет бакет в хранилище. Перед удалением бакета удалите в нем все объекты.

#### Пример запроса \{#delete-bucket-request-example}

```bash
curl -i -XDELETE \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>'
```

#### Пример ответа \{#delete-bucket-response-example}

В случае успеха запрос возвращает ответ с кодом 204.

```
HTTP/1.1 204 No Content
Content-Length: 0
Content-Type: Text/html; charset=UTF-8
```

## Объекты \{#objects}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <td>GET</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}/{'{object_name}'}</td>
        <td><a href="#get-object">Получение объекта</a></td>
      </tr>

      <tr>
        <td>PUT</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}/{'{object_name}'}</td>
        <td><a href="#upload-object">Загрузка объекта</a></td>
      </tr>

      <tr>
        <td>POST</td>
        <td>/v1/{'{project_id}'}</td>
        <td><a href="#delete-several-objects">Удаление нескольких объектов</a></td>
      </tr>

      <tr>
        <td>POST</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}/{'{object_name}'}</td>
        <td><a href="#manage-object-http-headers-and-metadata">Управление HTTP-заголовками и метаданными объектов</a></td>
      </tr>

      <tr>
        <td>COPY</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}/{'{object_name}'}</td>
        <td><a href="#copy-object">Копирование объекта</a></td>
      </tr>

      <tr>
        <td>DELETE</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}/{'{object_name}'}</td>
        <td><a href="#delete-object">Удаление объекта</a></td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Получить объект \{#get-object}

Выведет тело и заголовки объекта.

#### Пример запроса \{#get-object-request-example}

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>'
```

#### Пример ответа \{#get-object-response-example}

В случае успеха запрос возвращает ответ с кодом 200.

### Загрузить объект \{#upload-object}

Загружает объект в бакет. Такая загрузка используется для объектов размером до 100 МБ. Для объектов большего размера используйте [сегментированную загрузку](#segmented-objects).

При использовании заголовка `X-Copy-From` можно загрузить в бакет скопированный объект. Объект копируется вместе с заголовком `X-Delete-At` независимо от того, куда был установлен заголовок (на объект или бакет).

#### Заголовки запроса \{#upload-object-request-headers}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>X-Delete-At</td>
        <td>Время удаления объекта в формате Unix Timestamp</td>
      </tr>

      <tr>
        <td>X-Delete-After</td>
        <td>Срок хранения объекта (в секундах)</td>
      </tr>

      <tr>
        <td>Etag</td>
        <td>Идентификатор Etag</td>
      </tr>

      <tr>
        <td>X-Object-Meta-\<...></td>
        <td>Метаданные объекта, где \<...> — пользовательский заголовок</td>
      </tr>

      <tr>
        <td>X-Copy-From</td>
        <td>Путь до объекта, который нужно скопировать</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#upload-object-request-example}

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

```bash
curl -i -XPUT \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Delete-After: 180' \
-d "@<object_body>" \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>'
```

Укажите:

* `<object_body>` — тело объекта;
* `<object_name>` — имя, которое будет присвоено объекту.

Копирование объекта:

```bash
curl -i -XPUT \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Copy-From: /<bucket_name_1>/<object_name_1>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name_2>/<object_name_2>'
```

Укажите:

* `<bucket_name_2>` — бакет, в который скопируется объект;
* `<object_name_2>` — имя, с которым скопируется объект;
* `<bucket_name_1>` — бакет, в котором находится копируемый объект;
* `<object_name_1>` — объект, который нужно скопировать.

#### Пример ответа \{#upload-object-response-example}

При загрузке объекта в случае успеха запрос возвращает ответ с кодом 201.

```
HTTP/1.1 201 Created
Content-Length: 0
Content-Type: text/html
Etag: b65ad34618e410d9d8bf624d61f8a980
Date: Thu, 15 Mar 2023 07:31:32 GMT
```

При копировании объекта в случае успеха запрос возвращает ответ с кодом 201.

```
HTTP/1.1 201
Created etag: 0f343b0931126a20f133d67c2b018a3b
X-Copied-From: bucket_name_1/object_name_1
X-Copied-From-Last-Modified: Mon, 27 May 2013 13:16:49 GMT
Last-Modified: Tue, 28 May 2018 06:30:51 GMT
```

### Удалить несколько объектов \{#delete-several-objects}

Удалит несколько объектов одновременно, в том числе объекты из разных бакетов. Объекты удаляются последовательно.

#### Пример запроса \{#delete-several-objects-request-example}

Удаление объектов из разных бакетов:

```bash
curl -i -XPOST \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'Content-Type: text/plain' \
-d $'<bucket_name_1>/<object_name_1>\n<bucket_name_2>/<object_name_2>' \
'https://<swift_domain>/v1/<project_id>?bulk-delete=true&format=json'
```

Укажите:

* `<bucket_name_1>/<object_name_1>` — путь до объекта в первом бакете;
* `<bucket_name_2>/<object_name_2>` — путь до объекта во втором бакете;
* `\n` — перенос строки, необходимо указывать между объектами.

#### Пример ответа \{#delete-several-objects-response-example}

В случае успеха запрос возвращает ответ с кодом 200.

```
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Fri, 08 Jun 2018 13:37:53 GMT
Content-Length: 101
{'Number Not Found':0,'Response Status':'200 OK','Response Body':'','Errors':null,'Number Deleted':2}
```

### Управлять HTTP-заголовками и метаданными объектов \{#manage-object-http-headers-and-metadata}

Устанавливает значения для указанных в запросе пользовательских и HTTP-заголовков. Заголовки используются для управления кэшированием на стороне клиента и промежуточных прокси-серверах.

Поддерживаемые HTTP-заголовки:

* `Cache-Control`
* `Content-Encoding`
* `Content-Type`
* `Content-Disposition`
* `Link`

#### Заголовки запроса \{#manage-object-http-headers-and-metadata-request-headers}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>X-Container-Meta-\<...></td>
        <td>Заголовок, параметры которого нужно установить. Укажите \<...> — заголовок (например, X-Container-Meta-Cache-Control)</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#manage-object-http-headers-and-metadata-request-example}

Добавление заголовка `Link` к объекту:

```bash
curl -i -XPOST \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'Link: rel=canonical' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>'
```

Добавление пользовательского заголовка:

```bash
curl -i -XPOST \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Object-Meta-Some: metadata' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>'
```

#### Пример ответа \{#manage-object-http-headers-and-metadata-response-example}

Запрос на добавление заголовка `Link` в случае успеха возвращает ответ с кодом 202.

```
HTTP/1.1 202 Accepted
Content-Length: 76
Content-Type: text/html
```

Запрос на добавление пользовательского заголовка в случае успеха возвращает ответ с кодом 201.

```
HTTP/1.1 201 Created
Content-Length: 0
Content-Type: text/html
Etag: d41d8cd98f00b204e9800998ecf8427e
```

### Копировать объект \{#copy-object}

Объект будет скопирован в другой бакет или по другому префиксу. Если для заголовка `X-Fresh-Metadata` установить значение `true`, то при копировании новый объект будет создан с новыми заголовками, в том числе без `X-Delete-At`.

#### Заголовки запроса \{#copy-object-request-headers}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>Destination</td>
        <td>Путь, по которому будет скопирован объект</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#copy-object-request-example}

```bash
curl -i -XCOPY \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'Destination: /<bucket_name_2>/<object_name_2>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name_1>/<object_name_1>'
```

Укажите:

* `<bucket_name_1>` — бакет, в котором находится копируемый объект;
* `<object_name_1>` — объект, который нужно скопировать.
* `<bucket_name_2>` — бакет, в который скопируется объект;
* `<object_name_2>` — имя, с которым скопируется объект.

#### Пример ответа \{#copy-object-response-example}

В случае успеха запрос возвращает ответ с кодом 201.

```
HTTP/1.1 201
Created etag: 0f343b0931126a20f133d67c2b018a3b
X-Copied-From: bucket1/file
X-Copied-From-Last-Modified: Mon, 27 May 2013 13:16:49 GMT
Last-Modified: Tue, 28 May 2013 06:30:51 GMT
```

### Удалить объект \{#delete-object}

Объект будет удален из бакета.

Для удаления сегментированного объекта используйте query-параметром `?multipart-manifest=delete` — будут удалены сегменты объекта и манифест.

#### Пример запроса \{#delete-object-request-example}

```bash
curl -i -XDELETE \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>'
```

#### Пример ответа \{#delete-object-response-example}

В случае успеха запрос возвращает ответ с кодом 204.

```
HTTP/1.1 204 No Content
Content-Length: 0
Content-Type: text/html; charset=UTF-8
```

#### Заголовки для отложенного удаления \{#delete-object-headers-for-delayed-deletion}

Заголовки указываются при отправке запросов PUT и POST и определяют, когда объект будет автоматически удален из хранилища.

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Значение</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>X-Delete-At</td>
        <td>Значение времени (timestamp) в формате Unix Epoch</td>
        <td>Сервер будет хранить объект до времени, переданном в заголовке. Для конвертирования в человекочитаемый вид можно использовать <a href="https://www.epochconverter.com/">EpochConverter</a>.</td>
      </tr>

      <tr>
        <td>X-Delete-After</td>
        <td>Целочисленное количество секунд</td>
        <td>Сервер преобразует это значение в заголовок X-Delete-At. Через указанное количество секунд запрос начнет возвращать ответ 404 на запрос к объекту, при этом объекты автоматически удаляются через некоторое время.</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

Если указаны оба заголовка, приоритетным будет заголовок `X-Delete-After`.

Особенности работы заголовков:

* если объект загружается с помощью PUT-запроса и заголовком `X-Delete-At`, а у бакета модифицированный заголовок, заголовок объекта будет перезаписан на заголовок бакета;
* если в бакете включено версионирование, заголовки `X-Delete-At` и `X-Delete-After` не переносятся на созданную версию. Загруженная версия удалена не будет, но объект пропадет из списка.

## Сегментированные объекты \{#segmented-objects}

В хранилище нет ограничений на размер загружаемых объектов, но объекты размером более 100 МБ не рекомендуется помещать в хранилище целиком — нужно разбивать объект на сегменты, загружать каждый сегмент объекта и файл манифеста, объединяющий все сегменты объекта (технология DLO/SLO). Подробнее о загрузке сегментированных объектов в инструкции документации [Загрузить объект](/s3/objects/upload-object/#segmented-upload).

При использовании сегментированной загрузки можно загружать два типа больших объектов:

* динамические (DLO), при загрузке манифеста динамического объекта необходимо указать бакет и префикс сегментов. Вы можно загружать и удалять отдельные сегменты без необходимости менять файл манифеста;
* статические (SLO), при загрузке манифеста статического объекта указывается путь до каждого сегмента, из которых состоит объект. При каждом изменении сегментов необходимо редактировать и загружать заново файл манифеста. Опционально для сегментов можно указать их контрольные суммы (Etag) и размер.

Чтобы получить файл манифеста, выполните [GET-запрос на получение объекта](#get-object) с query-параметром `?multipart-manifest=get`.

Удалить все сегменты и объект с манифестом можно с помощью [DELETE-запроса](#delete-object) с query-параметром `?multipart-manifest=delete`.

### Загрузить сегменты объекта \{#upload-object-segments}

Мы рекомендуем сначала загружать сегменты, а потом создавать или обновлять манифест. Пока не завершится загрузка всех сегментов, объект не будет доступен для скачивания.

#### Пример запросов \{#segmented-objects-request-example}

```bash
curl -i -XPUT \
-H 'X-Auth-Token: <x_auth_token>' \
-d "hello " \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>/00000001'

curl -XPUT \
-H 'X-Auth-Token: <x_auth_token>' \
-d "world" \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>/00000002'

curl -XPUT \
-H 'X-Auth-Token: <x_auth_token>' \
-d "!" \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>/00000003'
```

#### Пример ответа \{#segmented-objects-response-example}

В случае успеха запросы возвращают ответы с кодом 201.

### Загрузить манифест динамического объекта \{#upload-dynamic-object-manifest}

#### Пример запроса \{#upload-dynamic-object-manifest-request-example}

```bash
curl -XPUT \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Object-Manifest: <bucket_name>/<object_name>/' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>'
```

#### Пример ответа \{#upload-dynamic-object-manifest-response-example}

В случае успеха запрос возвращает ответ с кодом 201.

### Загрузить манифест статического объекта \{#upload-static-object-manifest}

#### Пример запроса \{#upload-static-object-manifest-request-example}

В теле манифеста статического объекта укажите путь до каждого сегмента объекта.

```bash
curl -XPUT \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Static-Large-Object: True' \
-d "[{"path": "/<bucket_name>/<object_name>/00000001"}, {"path": "/<bucket_name>/<object_name>/00000002"}, {"path": "/<bucket_name>/<object_name>/00000003"} ...]" \
'https://<swift_domain>/v1/<project_id>/<bucket_name>/<object_name>?multipart-manifest=put'
```

#### Пример ответа \{#upload-static-object-manifest-response-example}

В случае успеха запрос возвращает ответ с кодом 201.

## Лимиты \{#limits}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <td>POST</td>
        <td>/v1/{'{project_id}'}/{'{bucket_name}'}</td>
        <td><a href="#set-bucket-limits">Установка лимитов на бакет</a></td>
      </tr>

      <tr>
        <td>POST</td>
        <td>/v1/{'{project_id}'}</td>
        <td><a href="#set-project-limits">Установка лимитов на проект</a></td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Установить лимиты на бакет \{#set-bucket-limits}

Устанавливает на бакет ограничения, переданные в заголовках `X-Container-Meta-Quota-Bytes` и `X-Container-Meta-Quota-Count`.

#### Заголовки запроса \{#set-bucket-limits-request-headers}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>X-Container-Meta-Quota-Bytes</td>
        <td>Максимальный объем хранения данных (в байтах)</td>
      </tr>

      <tr>
        <td>X-Container-Meta-Quota-Count</td>
        <td>Максимальное количество объектов в бакете</td>
      </tr>

      <tr>
        <td>X-Container-Meta-Default-Delete-After</td>
        <td>Срок хранения всех объектов в бакете (в секундах). По истечении этого срока объекты будут автоматически удалены</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#set-bucket-limits-request-example}

```bash
curl -i -XPOST \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Container-Meta-Quota-Bytes: 52428800' \
-H 'X-Container-Meta-Quota-Count: 1000' \
-H 'X-Container-Meta-Default-Delete-After: 300' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>'
```

#### Пример ответа \{#set-bucket-limits-response-example}

В случае удачного выполнения запроса будет возвращен ответ с кодом 202.

```
HTTP/1.1 202 Accepted
Content-Length: 76
Content-Type: text/html
```

### Установить лимиты на проект \{#set-project-limits}

Устанавливает на проект ограничение, переданное в заголовке `X-Account-Meta-Quota-Bytes`.

#### Заголовки запроса \{#set-project-limits-request-headers}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Описание</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>X-Container-Meta-Quota-Bytes</td>
        <td>Максимальный объем хранения данных (в байтах)</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

#### Пример запроса \{#set-project-limits-request-example}

```bash
curl -i -XPOST \
-H 'X-Auth-Token: <x_auth_token>' \
-H 'X-Account-Meta-Quota-Bytes: 52428800' \
'https://<swift_domain>/v1/<project_id>'
```

#### Пример ответа \{#set-project-limits-response-example}

В случае удачного выполнения запроса будет возвращен ответ с кодом 202.

```
HTTP/1.1 202 Accepted
Content-Length: 76
Content-Type: text/html
```

## Дополнительные query-параметры \{#additional-query-parameters}

В запросе на [получение списка бакетов](#get-list-of-bucket-objects-and-metadata) или [объектов](#get-object) можно использовать дополнительные query-параметры.

### format \{#format}

Вернет список объектов в определенном формате.

Пример запроса:

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>?format=json'
```

Список объектов будет возвращен в формате JSON.

### limit \{#limit}

Задаст точное количество объектов, которые будут включены в список (например, при работе с бакетами, где хранится большое количество объектов).

Пример запроса:

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>?limit=20'
```

В список будут включены первые 20 объектов.

### marker \{#marker}

Задаст объект, начиная с которого будет выведен список.

Пример запроса:

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>?marker=<object_name>'
```

В списке будут отображены объекты, которые следуют после объекта `<object_name>`.

### prefix \{#prefix}

Включит в список объекты, имена которых начинаются с указанной последовательности символов.

Пример запроса:

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>?prefix=my'
```

В списке будут отображены объекты, которые начинаются с символов `my`.

### delimiter \{#delimiter}

S3 имеет плоскую структуру и не поддерживает папки, но с помощью параметра `delimiter` можно вывести псевдоиерархию.
Запрос с параметром выведет только ту часть имени объектов, которая следует до указанных символов, если он присутствует в выводе имени объекта.

Пример запроса:

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>?delimiter=/'
```

Будут выведены файлы и части префиксов (псевдопапки) на верхнем уровне:

```
photos/
videos/
file.jpg
```

Здесь:

* `photos/`, `videos/` — части префиксов до символа `/`, которые есть у объектов в бакете;
* `file.jpg` — файл без префикса (символа `/` в названии).

Параметр `delimiter` можно использовать совместно с параметром `prefix`, чтобы выводить список объектов и псевдопапок по указанному префиксу.

Пример запроса:

```bash
curl -i \
-H 'X-Auth-Token: <x_auth_token>' \
'https://<swift_domain>/v1/<project_id>/<bucket_name>?prefix=photos/&delimiter=/'
```

Пример вывода:

```
photos/animals/
photos/file.jpg
```

## Символические ссылки \{#symbolic-links}

Символическая ссылка — это пустой объект, который указывает на другой объект. С их помощью можно получить доступ к объектам в другом бакете:

* с другой политикой хранения — например, получить доступ к объекту в бакете с холодным хранением из бакета со стандартным;
* с другим типом — например, получить доступ к объекту в приватном бакете через символическую ссылку, размещенную в публичном бакете.

Создать символическую ссылку можно с помощью пустого [PUT-запроса на загрузку объекта](#upload-object) с заголовком `X-Symlink-Target: <bucket_name>/<object_name>`.

По умолчанию символические ссылки динамические — они ссылаются на объект по его имени. Символическую ссылку можно сделать статической: при переходе по ссылке дополнительно проверяется Etag объекта. Для этого добавьте в запрос заголовок `X-Symlink-Target-Etag: <etag>`.

Если объект с ссылкой будет не пустой, запрос вернет ответ 400.

Чтобы получить объект с символической ссылкой, выполните GET или HEAD-запрос с параметром `?symlink=get`.
